Tenemos una route y un middleware como este:
Cuando las hacemos así:
//middleware router.use((req, res, next) => { // check header or url parameters or post parameters for token let token = req.body.token || req.query.token || req.headers['x-access-token'], // verifies secret and checks exp jwt.verify(token, config.secret, (err, decoded) => { if (err) { return res.json({ success: false, message: 'Failed to authenticate token.' }); } else { // if everything is good, save to request for use in other routes res.locals.test = "test"; req.somevariable = "variable1"; console.log("res.locals.test inside middleware ", JSON.stringify(res.locals.test)); console.log("req.somevariable inside middleware ", JSON.stringify(req.somevariable)); next(); } }); next(); }); //TestRoute router.get('/TestRoute', (req, res) => { console.log("res.locals.test outside middleware ", JSON.stringify(res.locals.test)); console.log("req.somevariable outside middleware ", JSON.stringify(req.somevariable)); }); Los valores de req.somevariable y res.locals.test no están undefined fuera del middleware
Cuando las hacemos así:
//middleware router.use((req, res, next) => { res.locals.test = "test"; req.somevariable = "variable1"; console.log("res.locals.test inside middleware ", JSON.stringify(res.locals.test)); console.log("req.somevariable inside middleware ", JSON.stringify(req.somevariable)); next(); }); //TestRoute router.get('/TestRoute', (req, res) => { console.log("res.locals.test outside middleware ", JSON.stringify(res.locals.test)); console.log("req.somevariable outside middleware ", JSON.stringify(req.somevariable)); }); Los valores de req.somevariable y res.locals.test están disponibles fuera del middleware .
¿Cuál es el problema aquí?
res.locals.VARIABLENAME = req.user
VARIABLENAME (cualquiera que sea la variable en la que lo configure) puede aparecer como indefinido cuando usa .ejs o cuando la representación dinámica con esa variable, puede obtener errores como que su nombre de variable no está definido.
ESTO ES UNA EXTRAÑA con res.locals : cuando desee utilizar el nombre de la variable que configuró en res.locals con la representación, debe definir req.user en su función QUE REPRESENTA EL ARCHIVO.
Backend: res.locals.currentUser = req.user
//THIS FUNCTION WILL RENDER PERFECTLY LETTING ME USE currentUser in my .ejs file upgradeForm(req, res, next) { let saved = req.user; if(req.user){ res.render("users/upgrade"); } else{ req.flash("notice", "You've successfully signed in!"); res.redirect("/"); } }SIN EMBARGO
//THIS FUNCTION WILL SAY currentUser is UNDEFINED IN MY .ejs file upgradeForm(req, res, next) { if(req.user){ res.render("users/upgrade"); } else{ req.flash("notice", "You've successfully signed in!"); res.redirect("/"); } } No hay diferencia de código, excepto que la representación de la función de trabajo tiene req.user establecido en una variable (ni siquiera tiene que usar esa variable). Me tomó 9 horas resolver este problema, ¡pero ahora ya lo sabes!