Passando le variabili al middleware successivo usando next () in Express.js


200

Bene, la mia domanda è che voglio passare alcune variabili dal primo middleware a un altro middleware, e ho provato a farlo, ma c'era " req.somevariableè un dato come 'indefinito'".


//app.js
..
app.get('/someurl/', middleware1, middleware2)
...

////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...

////middleware2
...
some conditions
...
variable = req.somevariable;
...

Dovrebbe funzionare. A meno che non sia un refuso nella domanda, probabilmente fallisci perché assegni il valore resin middleware1 e provi a ottenerlo reqin middleware2.
Andreas Hultgren,

Thankz @AndreasHultgren
user2791897

Local variables are available in middleware via req.app.locals expressjs.com/pt-br/api.html#app.locals
Ronnie Royston

Risposte:


202

Collega la tua variabile reqall'oggetto, no res.

Invece di

res.somevariable = variable1;

Avere:

req.somevariable = variable1;

Come altri hanno sottolineato, res.localsè il modo consigliato di trasferire i dati attraverso il middleware.


13
usa res.locals.variable = var; vedi l'altra risposta
Godzsa,

1
per recuperare la variabile, utilizzare req.res.locals.variable nella prossima funzione middleware
William Wu,

3
@WilliamWu è res.localsno req.res.locals.
cchamberlain,

2
res.locals.myVarè la strada da percorrere.
jasonseminara,

449

Ecco a cosa serve l' oggetto res.locals . L'impostazione delle variabili direttamente sull'oggetto richiesta non è supportata o documentata. res.locals è garantito per mantenere lo stato per tutta la durata di una richiesta.

res.locals

Un oggetto che contiene variabili locali di risposta nell'ambito della richiesta e quindi disponibili solo per le viste visualizzate durante quel ciclo di richiesta / risposta (se presente). Altrimenti, questa proprietà è identica a app.locals.

Questa proprietà è utile per esporre informazioni a livello di richiesta come il nome del percorso della richiesta, l'utente autenticato, le impostazioni dell'utente e così via.

app.use(function(req, res, next) {
    res.locals.user = req.user;  
    res.locals.authenticated = !req.user.anonymous;
    next();
});

Per recuperare la variabile nel middleware successivo:

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});

67
Non so perché questa non è la risposta accettata, questo è il modo documentato di impostare variabili dal middleware durante una richiesta.
Sam Holmes,

11
res.locals è inteso per essere utilizzato da viste che alla fine vengono rese durante il ciclo di vita della richiesta, questo è ciò che dice la documentazione. Se non si utilizza una vista che è eccessivo per mettere le cose sull'oggetto gente del posto ed è non è la convenzione. In questi casi, tendo a incoraggiare le persone a rispettare la convenzione in modo da poter ridurre il carico cognitivo mentre apprendiamo concetti come Express o richiediamo cicli di vita.
real_ate

2
@real_ate che è l'uso principale di res.locals, tuttavia non affronta la questione dei PO. Il passaggio di variabili con ambito di richiesta al middleware futuro è talvolta una necessità, le volte che ne sono venute fuori si basano generalmente sull'autenticazione dell'utente in un middleware iniziale che imposta le richieste che vengono instradate in un middleware downstream.
cchamberlain,

14
La documentazione esplicita per la scrittura del middleware imposta le variabili reqsull'oggetto expressjs.com/en/guide/writing-middleware.html . Guarda la sezioneMiddleware function requestTime
Catfish

3
@goonerify per fortuna non funziona come funziona la risposta. Le risposte vengono trasmesse chiamando una proprietà funzionale dell'oggetto risposta come res.json({}), ecc., res.localsÈ disponibile solo sul back-end per tutta la durata della richiesta. expressjs.com/en/5x/api.html
cchamberlain,

22

Non penso che le migliori pratiche passeranno una variabile simile req.YOUR_VAR. Potresti voler considerare req.YOUR_APP_NAME.YOUR_VARoreq.mw_params.YOUR_VAR .

Ti aiuterà a evitare di sovrascrivere altri attributi.

Aggiornamento del 31 maggio 2020

res.locals è ciò che stai cercando, l'oggetto è nell'ambito della richiesta.

Un oggetto che contiene variabili locali di risposta nell'ambito della richiesta e quindi disponibili solo per le viste visualizzate durante quel ciclo di richiesta / risposta (se presente). Altrimenti, questa proprietà è identica a app.locals.

Questa proprietà è utile per esporre informazioni a livello di richiesta come il nome del percorso della richiesta, l'utente autenticato, le impostazioni dell'utente e così via.


2
Come suggerisci di impostare req.YOUR_APP_NAME = {}inizialmente? Basta provare a scrivere per req.YOUR_APP_NAME.someVarricevere un errore in quanto req.YOUR_APP_NAMEnon ancora definito.
Kousha,

2
@Kousha Puoi scrivere il middleware del router nella parte superiore dello script di routing:router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
Tomas

c'è un modo per passarlo come param con la funzione next ()? come next (myObj)
philx_x

1
@Kousha - Il tuo errore indefinito non ha nulla a che fare con express, stai cercando di assegnare una proprietà a un oggetto che non esiste. In genere per fare questo si userebbe req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'.
cchamberlain,

1
@philx_x, se si passa qualsiasi parametro alla nextfunzione, si attiverà il gestore degli errori express e si ritirerà. controlla i documenti.
Merl,

7

Questo perché reqe ressono due oggetti diversi.

Devi cercare la proprietà sullo stesso oggetto a cui l'hai aggiunta.


3

Il trucco è piuttosto semplice ... Il ciclo di richiesta è ancora abbastanza vivo. Puoi semplicemente aggiungere una nuova variabile che creerà una chiamata temporanea

app.get('some/url/endpoint', middleware1, middleware2);

Dal momento che è possibile gestire la richiesta nel primo middleware

(req, res, next) => {
    var yourvalue = anyvalue
}

Nel middleware 1 gestisci la tua logica e memorizzi il tuo valore come di seguito:

req.anyvariable = yourvalue

Nel middleware 2 è possibile rilevare questo valore dal middleware 1 nel modo seguente:

(req, res, next) => {
    var storedvalue = req.yourvalue
}

1

Come accennato in precedenza, res.locals è un buon modo (consigliato) per farlo. Vedi qui per un breve tutorial su come eseguire questa operazione in Express.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.