324 votes

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

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 donné comme 'undefined'".


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

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

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

7voto

Delino Points 190

Le truc est assez simple... Le cycle de la requête est toujours bien actif. Vous pouvez simplement ajouter une nouvelle variable qui créera un temporaire, appelant

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

Étant donné que vous pouvez gérer votre requête 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 faisant ce qui suit:

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

1voto

nax3t Points 117

Comme mentionné ci-dessus, res.locals est un bon moyen (recommandé) de le faire. Voir ici pour un tutoriel rapide sur comment le faire dans Express.

0voto

p galiardi Points 1

De https://expressjs.com/fr/guide/writing-middleware.html :

const requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

0voto

chandan-shr Points 1

J'ai également rencontré ce problème et pour le surmonter, j'ai enregistré la variable dans Middleware2 transmise depuis Middleware1. Ainsi, la solution basée sur la question initiale ressemble à ceci :

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

// middleware1
// ...
req.somevariable = variable1;
next();

// middleware2
// ...
const variable = req.somevariable;

0voto

Akash Points 5697

En plus des middleware, j'utilise également des fonctions "utilitaires" pour ne pas avoir à manipuler les variables req/res (ce qui augmente un peu la complexité).

// par exemple, nous avons besoin d'une condition basée sur les en-têtes
const isUserAdmin = async(headers) => {
   const authHeaderValue = headers.authorization;
   // effectuer la logique
   return true; // ou false
}

app.get("/hello-world", async(req, res, next) => {
  const isAdmin = await isUserAdmin(req.headers)
  if(isAdmin) {
    res.send("Vous êtes administrateur.")
  } else {
    res.send("Vous n'avez pas accès en tant qu'administrateur.")
  }
})

Remarquez que isUserAdmin est une fonction réutilisable pouvant être utilisée dans un nombre illimité de gestionnaires de requêtes.

Bonne chance...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X