Używam ekspresu, aby stworzyć aplikację internetową w node.js. Jest to uproszczenie tego, co mam:
var express = require('express');
var jade = require('jade');
var http = require("http");
var app = express();
var server = http.createServer(app);
app.get('/', function(req, res) {
// Prepare the context
res.render('home.jade', context);
});
app.post('/category', function(req, res) {
// Process the data received in req.body
res.redirect('/');
});
Mój problem jest następujący:
Jeśli stwierdzę, że dane zostały wysłane /category
nie sprawdzają się, chciałbym przekazać stronie dodatkowy kontekst /
. Jak mogłem to zrobić? Wydaje się, że przekierowanie nie pozwala na żaden dodatkowy parametr.
flash
: stackoverflow.com/questions/12442716/…/
strony. Istnieje/
trasa, którą Express może obsłużyć, i istnieje szablon strony głównej, który Express może renderować. Jeśli chcesz zachować niektóre dane do renderowania szablonu strony głównej po przekierowaniu, pomimo zaakceptowanej odpowiedzi sesje są Twoim przyjacielem. Dają ci magazyn danych, który utrzymuje się wśród żądań i odpowiedzi dla poszczególnych użytkowników przeglądających, dzięki czemu możesz wprowadzić dane podczas/category
obsługi, a następnie wyjąć je, jeśli są tam podczas/
przekazywania.Odpowiedzi:
Istnieje kilka sposobów przekazywania danych na różne trasy. Najbardziej poprawną odpowiedzią są oczywiście ciągi zapytań. Musisz upewnić się, że wartości są prawidłowo encodeURIComponent i decodeURIComponent .
Możesz złapać to na drugiej trasie, wysyłając parametry za pomocą
req.query
.Aby uzyskać bardziej dynamiczny sposób, możesz użyć
url
modułu podstawowego do wygenerowania ciągu zapytania:Więc jeśli chcesz przekierować wszystkie zmienne ciągu zapytania, możesz to zrobić
A jeśli używasz Węzła> = 7.x, możesz również użyć
querystring
modułu podstawowegoInnym sposobem na zrobienie tego jest ustawienie czegoś w sesji. Tutaj możesz przeczytać, jak to ustawić , ale ustawianie i uzyskiwanie dostępu do zmiennych jest mniej więcej takie:
A później po przekierowaniu ...
Istnieje również możliwość korzystania starą cechę Express
req.flash
. W nowszych wersjach Express będzie to wymagało użycia innej biblioteki. Zasadniczo pozwala skonfigurować zmienne, które będą się wyświetlać i resetować przy następnej wizycie na stronie. Przydaje się do wyświetlania błędów użytkownikom, ale ponownie jest domyślnie usuwany. EDYCJA: Znaleziono bibliotekę, która dodaje tę funkcjonalność.Mam nadzieję, że da to ogólny pomysł na przekazywanie informacji w aplikacji Express.
źródło
/
trasę. Inną opcją jest wywołanie trasy pocztowej za pośrednictwem AJAX i zapisanie powstałych danych w magazynie lokalnym lub w podobny sposób.Najłatwiejszy sposób, jaki udało mi się przekazać do przesyłania danych między routeHandlerami, aby
next()
nie trzeba było bałagać się przekierowaniami ani sesjami. Opcjonalnie możesz po prostu zadzwonićhomeCtrl(req,res)
zamiastnext()
i po prostu przekazaćreq
ires
źródło
/
Musiałem znaleźć inne rozwiązanie, ponieważ żadne z dostarczonych rozwiązań nie spełniało moich wymagań z następujących powodów:
Ciągi zapytań : możesz nie chcieć używać ciągów zapytań, ponieważ adresy URL mogą być współużytkowane przez użytkowników, a czasem parametry zapytania nie mają sensu dla innego użytkownika. Na przykład błąd, który
?error=sessionExpired
nigdy nie powinien zostać wyświetlony innemu użytkownikowi.req.session : Możesz nie chcieć używać,
req.session
ponieważ potrzebujesz do tego zależności ekspresowej sesji , która obejmuje skonfigurowanie magazynu sesji (takiego jak MongoDB), który może nie być w ogóle potrzebny, a może już używasz niestandardowego rozwiązanie sklepu sesyjnego.next () : Możesz nie chcieć używać
next()
lubnext("router")
ponieważ to zasadniczo renderuje twoją nową stronę pod oryginalnym adresem URL, tak naprawdę nie jest to przekierowanie do nowego adresu URL, bardziej jak do przodu / do tyłu, co może być nie do przyjęcia.To moje czwarte rozwiązanie, które nie cierpi na żadne z poprzednich problemów. Zasadniczo wiąże się to z użyciem tymczasowego pliku cookie, dla którego musisz najpierw zainstalować parser plików cookie . Oczywiście oznacza to, że będzie działać tylko przy włączonych plikach cookie i przy ograniczonej ilości danych.
Przykład realizacji:
źródło
express-session
. Baza danych po prostu sprawia, że sesje trwają po ponownym uruchomieniu serwera.użyj app.set i app.get
Ustawianie danych
Pobieranie danych
źródło
Oto, co proponuję bez używania jakiejkolwiek innej zależności, wystarczy węzeł i ekspres, użyj app.locals, oto przykład:
źródło
Możesz przekazać małe bity danych para klucz / wartość przez ciąg zapytania:
I javascript na stronie głównej może uzyskać do niego dostęp i odpowiednio dostosować jego zachowanie.
Pamiętaj, że jeśli nie masz nic przeciwko
/category
pozostaniu jako adres URL w pasku adresu przeglądarki, możesz po prostu renderować bezpośrednio zamiast przekierowywać. IMHO wiele razy ludzie używają przekierowań, ponieważ starsze frameworki internetowe utrudniały bezpośrednią odpowiedź, ale jest to łatwe w ekspresowym:Jak skomentował @ Dropped.on.Caprica, użycie AJAX eliminuje problem zmiany adresu URL.
źródło
możemy użyć sesji ekspresowej aby wysłać wymagane dane
podczas inicjalizacji aplikacji
więc przed przekierowaniem zapisz kontekst dla sesji
Teraz możesz uzyskać kontekst w dowolnym miejscu sesji. można to uzyskać tylko przez req.session.context
źródło