2013-03-08 8 views
13

Próbuję zrozumieć, kiedy najlepiej jest użyć każdego z poniższych. Oto moje podstawowe zrozumienie:Express.js: app.locals vs req.locals vs req.session

app.locals - dobre do przechowywania zmiennych globalnych na poziomie aplikacji. wszyscy użytkownicy/sesje zobaczą te same wartości dla tych zmiennych. zmienne są dostępne dla wszystkich widoków.

res.locals - dobre do przechowywania zmiennych dla określonego cyklu żądanie/odpowiedź. zmienne są dostępne tylko dla widoku powiązanego z odpowiedzią.

req.session - dobre do przechowywania zmiennych związanych z unikalną sesją użytkownika (np. Nazwa użytkownika). te zmienne powinny być dostępne dla wszystkich widoków dla unikalnego użytkownika/sesji.

Szczególny przypadek użycia mam: Użytkownik uruchamia kwerendę, która pobiera dane z mongodb. Teraz chcę, aby wynik tego zapytania, który jest tablicą json, jest dostępny jako zmienna dla wszystkich widoków (żądań http). Jaki jest najlepszy sposób "przechowywania" tablicy wyników, aby każdy widok mógł uzyskać do niej dostęp?

Dzięki

+0

Sam prawie odpowiedziałeś na to pytanie. req.locals jest dla danych, które powinny być dostępne w widokach dla bieżącego żądania. –

+4

to 'res.locals', a nie' req.locals' – Daniel

Odpowiedz

4

Chcę teraz wynik tego zapytania, który jest tablicą JSON, dostępny jako zmienne do wszystkich widokach. Jaki jest najlepszy sposób na "przechowywanie" tablicy wyników, aby każdy widok mógł uzyskać do niej dostęp?

Kiedy mówisz "dostępne dla WSZYSTKICH widoków" zakładam, że masz na myśli wszystkie żądania HTTP. W takim przypadku należy pamiętać, że protokół HTTP jest protokołem bezstanowym i nie przewiduje tego. Będziesz musiał opracować swój własny mechanizm.

Jedną z metod jest buforowanie tej informacji (tablicy) na serwerze i pobieranie jej na każde żądanie (na przykład pobranie z pamięci zamiast z MongoDB). Przechowujesz identyfikator sesji w pliku cookie i na podstawie tego identyfikatora pobierzesz go z pamięci podręcznej po otrzymaniu kolejnego żądania. Dostępnych jest kilka narzędzi pamięci podręcznej (np. Redis, memcached, itp.), Które można wybrać do przechowywania informacji w pamięci.

Można również cookie tej informacji (sama tablica), w którym to przypadku będzie ona wysyłana tam iz powrotem między klientem i serwerem na każde żądanie HTTP i bardzo prawdopodobne, że nie będzie to bardzo dobry pomysł, chyba że dane są bardzo mały.

+1

Jeśli przechowujesz dane w 'app.locals' i nie uruchamiasz więcej niż jednego procesu Node (tzn. Nie używasz' cluster'), to będzie dostępny dla wszystkich wyświetleń, nawet dla żądań. – robertklep

+0

@robertklep - to było to, co pierwotnie zrobiłem, zapisał dane w app.locals, ale potem uruchomiłem test z dwoma komputerami, które wysyłają żądania HTTP i obaj widzieli te same dane! Nie chcę udostępniać danych między klientami. –

+2

Czy chcesz, aby były dostępne we wszystkich widokach, ale tylko dla użytkownika, który wywołał zapytanie? Użyj 'req.session' (ponownie, w pytaniu już odpowiesz ;-) – robertklep