Pasando variables al siguiente middleware usando next () en Express.js


Bueno, mi pregunta es que quiero pasar alguna variable del primer middleware a otro middleware, y traté de hacer esto, pero había "req.somevariable es un dado como 'indefinido'".


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

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

////middleware2
...
some conditions
...
variable = req.somevariable;
...
Author: Peter Mortensen, 2013-09-18

5 answers

Adjunte su variable al objeto req, no res.

En lugar de

res.somevariable = variable1;

Tienen:

req.somevariable = variable1;

Como otros han señalado, res.locals es la forma recomendada de pasar datos a través del middleware.

 125
Author: Amberlamps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-09 19:01:25

Para esto es el objeto res.locals. No se admiten ni documentan las variables de configuración directamente en el objeto request. res.locals está garantizado para mantener el estado durante la vida de una solicitud.

Res. locals

Un objeto que contiene variables locales de respuesta solicitud, y por lo tanto disponible solo para la (s) vista (s) renderizada (s) durante ese ciclo de solicitud / respuesta (en su caso). De lo contrario, esta propiedad es idéntico a app.local.

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

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

Para recuperar la variable en el próximo middleware:

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});
 215
Author: cchamberlain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-08 01:27:06

No creo que la mejor práctica sea pasar una variable como req.YOUR_VAR. Es posible que desee considerar req.YOUR_APP_NAME.YOUR_VAR o req.mw_params.YOUR_VAR.

Te ayudará a evitar sobrescribir otros atributos.

 19
Author: Doron Segal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-09 19:03:24

Eso es porque req y res son dos objetos diferentes.

Debe buscar la propiedad en el mismo objeto al que la agregó.

 3
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-18 14:43:41

El truco es bastante simple... El ciclo de solicitud sigue bastante vivo. Simplemente puede agregar una nueva variable que creará un temporal, llamando a

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

Ya que puede manejar su solicitud en el primer middleware

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

En middleware 1 usted maneja su lógica y almacena su valor como abajo:

req.anyvariable = yourvalue

En middleware 2 puede capturar este valor desde middleware 1 haciendo lo siguiente:

(req, res, next) => {
    var storedvalue = req.yourvalue
}
 0
Author: delino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-09 19:05:15