web-dev-qa-db-fra.com

Passer des variables au middleware suivant en utilisant next () dans Express.js

Eh bien, ma question est que je veux passer une variable du premier middleware à un autre middleware, et j'ai essayé de le faire, mais il y avait "req.somevariable est une donnée comme étant 'indéfinie'".


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

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

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

Attachez votre variable à l'objet req, pas res.

Au lieu de

res.somevariable = variable1;

Avoir:

req.somevariable = variable1;

Comme d'autres l'ont fait remarquer, res.locals est la méthode recommandée pour transmettre des données via un middleware.

162
Amberlamps

C’est à quoi sert l’objet res.locals . La définition de variables directement sur l'objet de requête n'est pas prise en charge ni documentée. res.locals a la garantie de conserver l'état pendant la durée de vie d'une requête.

res.locals

Un objet contenant des variables locales de réponse étendues à la demande, et donc uniquement disponibles pour la ou les vues rendues pendant ce cycle de demande/réponse (le cas échéant). Sinon, cette propriété est identique à app.locals.

Cette propriété est utile pour exposer des informations au niveau de la requête, telles que le nom du chemin de la requête, l'utilisateur authentifié, les paramètres utilisateur, etc.

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

Pour récupérer la variable dans le middleware suivant:

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

Je ne pense pas que la meilleure pratique consiste à transmettre une variable telle que req.YOUR_VAR. Vous voudrez peut-être prendre en compte req.YOUR_APP_NAME.YOUR_VAR ou req.mw_params.YOUR_VAR.

Cela vous aidera à éviter de remplacer d'autres attributs.

21
Doron Segal

C'est parce que req et res sont deux objets différents.

Vous devez rechercher la propriété sur le même objet que celui que vous avez ajouté.

6
SLaks

Le truc est assez simple ... Le cycle de demande est encore très vivant. Vous pouvez simplement ajouter une nouvelle variable qui créera un appel temporaire

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

Puisque vous pouvez gérer votre demande dans le premier middleware

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

Dans le middleware 1, vous gérez votre logique et stockez votre valeur comme ci-dessous:

req.anyvariable = yourvalue

Dans le middleware 2, vous pouvez récupérer cette valeur du middleware 1 en procédant comme suit:

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