Cóż, moje pytanie brzmi: chcę przekazać jakąś zmienną z pierwszego oprogramowania pośredniego do innego oprogramowania pośredniego i próbowałem to zrobić, ale było „ req.somevariable
podano jako„ niezdefiniowane ””.
//app.js
..
app.get('/someurl/', middleware1, middleware2)
...
////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...
////middleware2
...
some conditions
...
variable = req.somevariable;
...
javascript
node.js
express
middleware
next
użytkownik2791897
źródło
źródło
res
w oprogramowaniu pośrednim 1 i próbujesz uzyskać ją zreq
oprogramowania pośredniego 2.Local variables are available in middleware via req.app.locals
expressjs.com/pt-br/api.html#app.localsOdpowiedzi:
Nie dołączaj swojej zmiennej do
req
obiektures
.Zamiast
Mieć:
Jak zauważyli inni,
res.locals
jest to zalecany sposób przesyłania danych przez oprogramowanie pośrednie.źródło
res.locals
, niereq.res.locals
.res.locals.myVar
jest droga.Do tego służy obiekt res.locals . Ustawianie zmiennych bezpośrednio w obiekcie żądania nie jest obsługiwane ani dokumentowane. res.locals gwarantuje utrzymanie stanu przez cały okres ważności żądania.
res.locals
Aby pobrać zmienną z następnego oprogramowania pośredniego:
źródło
req
obiekcie expressjs.com/en/guide/writing-middleware.html . Spójrz na sekcjęMiddleware function requestTime
res.json({})
itp.,res.locals
Jest dostępna tylko na zapleczu przez cały czas trwania żądania. expressjs.com/en/5x/api.htmlNie sądzę, że najlepszą praktyką będzie przekazywanie zmiennej takiej jak
req.YOUR_VAR
. Możesz rozważyćreq.YOUR_APP_NAME.YOUR_VAR
lubreq.mw_params.YOUR_VAR
.Pomoże Ci to uniknąć zastąpienia innych atrybutów.
Aktualizacja 31 maja 2020 r
res.locals jest tym, czego szukasz, zakres obiektu jest zgodny z żądaniem.
Obiekt zawierający lokalne zmienne odpowiedzi o zasięgu do żądania, a zatem dostępny tylko dla widoków wyświetlanych podczas tego cyklu żądania / odpowiedzi (jeśli istnieje). W przeciwnym razie ta właściwość jest identyczna z app.locals.
Ta właściwość jest przydatna do ujawniania informacji na poziomie żądania, takich jak nazwa ścieżki żądania, uwierzytelniony użytkownik, ustawienia użytkownika i tak dalej.
źródło
req.YOUR_APP_NAME = {}
początkowo? Po prostu spróbuj napisać doreq.YOUR_APP_NAME.someVar
ciebie, pojawi się błąd, któryreq.YOUR_APP_NAME
nie został jeszcze zdefiniowany.router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'
.next
funkcji, uruchomi on ekspresową procedurę obsługi błędów i odpadnie. sprawdź dokumenty.To dlatego, że
req
ires
to dwa różne obiekty.Musisz poszukać właściwości na tym samym obiekcie, do którego ją dodałeś.
źródło
Sztuczka jest dość prosta ... Cykl zapytań wciąż jest całkiem żywy. Możesz po prostu dodać nową zmienną, która utworzy tymczasowe wywołanie
Ponieważ możesz obsłużyć żądanie w pierwszym oprogramowaniu pośrednim
W oprogramowaniu pośrednim 1 zarządzasz logiką i przechowujesz swoją wartość jak poniżej:
W oprogramowaniu pośrednim 2 można przechwycić tę wartość z oprogramowania pośredniego 1, wykonując następujące czynności:
źródło
Jak wspomniano powyżej, res.locals jest dobrym (zalecanym) sposobem na zrobienie tego. Zobacz tutaj na szybki tutorial jak to zrobić w Express.
źródło