web-dev-qa-db-fra.com

req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals dans un middleware Express

Des questions similaires ont été posées, mais ma question est la suivante: si je souhaite propager des résultats intermédiaires via différents middleware de routage, quel est le meilleur moyen de le faire?

app.use(f1); app.use(f2); app.use(f3);

function f1(req,res,next) {
  //some database queries are executed and I get results, say x1
  res.locals.dbResults = {...};
  next();
}

function f2(req,res,next) {
  // more processing based upon req.locals.dbResults 
  res.locals.moreResults = {....};
  next();
}
// ...

Je pense que je peux obtenir la même propagation de données à travers les différents intergiciels en utilisant req. Locales. En outre, il apparaît que les objets requête et réponse ont tous les deux les propriétés locales initialisées à un objet vide au début de la requête.

En outre, vous pouvez également définir les propriétés res.mydata ou req.mydata?

En théorie, app.locals peut également être utilisé pour transmettre ces données à travers les différents middleware, car elles persisteront dans les middlewares, mais cela irait à l'encontre de l'utilisation conventionnelle d'app.locals. Il est plus utilisé pour les données spécifiques à l'application. Il sera également nécessaire d'effacer ces données à la fin du cycle requête-réponse afin que les mêmes variables puissent être utilisées pour la requête suivante.

Quel est le moyen optimal et standard de propager des résultats intermédiaires via un middleware?

52
Sunny

Comme vous l'avez mentionné, req.locals, res.locals Ou même votre propre clé définie res.userData Peuvent être utilisés. Cependant, lorsque vous utilisez un moteur de vue avec Express, vous pouvez définir des données intermédiaires sur res.locals Dans votre middleware. Ces données seront disponibles dans votre vue (voir this post ). Il est courant de définir des données intermédiaires à l'intérieur du middleware sur req.locals Pour éviter de remplacer les données d'affichage dans res.locals, Bien que cela ne soit pas officiellement documenté.

res.locals Objet contenant des variables locales de réponse étendues à la demande, et donc disponibles uniquement pour la ou les vues rendues au cours de ce cycle de demande/réponse. (si seulement). 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.

Source: http://expressjs.com/en/api.html#res.locals

109
xaviert