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.