req.locals frente a res.locals frente a res.data frente a req.data frente a app.locals en el middleware Express

82

Se hacen algunas preguntas similares, pero mi pregunta es que si quiero propagar los resultados intermedios que obtengo a lo largo de los diferentes middleware de enrutamiento, ¿cuál es la mejor manera de hacerlo?

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();
}
// ...

Creo que puedo obtener la misma propagación de datos a través de los diferentes middleware utilizando req .locals. Además, parece que los objetos de solicitud y respuesta tienen las propiedades locales inicializadas en un objeto vacío al comienzo de la solicitud.

Además, ¿también se pueden establecer las propiedades res.mydata o req.mydata?

En teoría, app.locals también se puede usar para pasar estos datos a través de diferentes middleware, ya que persistirán en los middlewares, pero eso sería contrario al uso convencional de app.locals. Se utiliza más para datos específicos de la aplicación. También será necesario borrar esos datos al final del ciclo de solicitud-respuesta para que se puedan usar las mismas variables para la siguiente solicitud.

¿Cuál es la forma óptima y estándar de propagar resultados intermedios a través de middleware?

Soleado
fuente

Respuestas:

151

Como mencionó, se pueden usar ambos req.locals, res.localso incluso su propia clave definida res.userData. Sin embargo, cuando usa un motor de visualización con Express, puede configurar datos intermedios res.localsen su middleware, y esos datos estarán disponibles en su vista (consulte esta publicación ). Es una práctica común activar los datos intermedios dentro del middleware req.localspara evitar sobrescribir los datos de la vista res.locals, aunque esto no está documentado oficialmente.

res.locals Un objeto que contiene variables locales de respuesta dentro del alcance de la solicitud y, por lo tanto, está disponible solo para las vistas representadas durante ese ciclo de solicitud / respuesta (si corresponde). De lo contrario, esta propiedad es idéntica a app.locals.

Esta propiedad es útil para exponer información a nivel de solicitud, como el nombre de la ruta de la solicitud, el usuario autenticado, la configuración del usuario, etc.

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

xaviert
fuente
Gracias por la aclaración sobre la distinción de documentación que funciona a favor de res.locals. Confirmaste mi entendimiento de que, en teoría, todos los enfoques son técnicamente iguales. Esperemos más comentarios. Votó a favor su respuesta ... ciertamente útil.
Soleado
Nota al margen: res.render()tiene prioridad sobre res.locals. Entonces, alguien podría sobrescribir accidentalmente la variable asíres.locals = { name: 'Jake' } // later in code... res.render('user.template', { name: 'Tony' }, (err, html) => {}) // the 'name' variable is now 'Tony'
zenoh
De todos modos, un diseño de middleware modular, limpio y bien planificado debería ser la mejor solución a largo plazo que simplemente confiar en una clave de objeto único
zenoh