在我的节点js app中,我在一些路由中使用一个函数作为中间件。我通常将res.locals用作function
,以便不覆盖res.locals
对象。但现在我更新了nodejs并表达了最新版本,并且Idon不知道为什么我会收到以下错误:
Unhandled rejection TypeError: res.locals is not a function
at /home/jose/workspace/tfg/server.js:116:8
at tryCatcher (/home/jose/workspace/tfg/node_modules/bluebird/js/release/util.js:11:23)
at Promise._settlePromiseFromHandler (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:491:31)
at Promise._settlePromise (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:548:18)
at Promise._settlePromise0 (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:593:10)
at Promise._settlePromises (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:672:18)
at Async._drainQueue (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:125:16)
at Async._drainQueues (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:135:10)
at Immediate.Async.drainQueues [as _onImmediate] (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:16:14)
at processImmediate [as _immediateCallback] (timers.js:383:17)
此中间件的功能如下所示:
function middle_datos (req, res, next){
var id_usuario = req.user ? req.user._id : 'undefined';
// object to override res.locals
var variables_locales = {
ip: IP,
message: JSON.stringify({
error: req.flash('error'),
success: req.flash('success'),
info : req.flash('info'),
}),
title: 'Informa Torrent',
subtitle: 'La app con la que podrás contribuir a la mejora de Torrent.',
user: req.user,
id_usuario: id_usuario
};
db.query(queries.obtener_datos_app) // consultamos los datos de la app
.then (function(datos_app){
variables_locales.datos_app = datos_app; // obtenemos datos app
if (! req.user) throw new Error('no estás loggeado'); // Si no hay usuario conectado --> Continuamos adelante
// ya que no consultamos notificaciones ni acciones
return db.query(queries.obtener_notificaciones, req.user._id); // consultamos notificaciones
})
.then(function(notificaciones){
// obtenemos notificaciones
variables_locales.mis_notificaciones = notificaciones; // ls pasamos al objeto res.locals
return db.query(queries.obtener_acciones, req.user._id); // consultamos acciones
})
.then (function(acciones){
// obtenemos acciones
variables_locales.mis_acciones = acciones;
res.locals(variables_locales); // Error
next(); // siguiente ruta o middleware
})
.catch(function (error) {
console.log('Error middleware ' + error); // print the error;
res.locals(variables_locales);
next(); // siguiente ruta o middleware
});
};
那么,res.locals有什么问题?
此外,如果我尝试以这种方式将一些键值推送到res.locals:
res.locals.someKey = someValue;
我无法从我的jade模板中访问该变量。
任何帮助都会很感激!
答案 0 :(得分:1)
res.locals
不是一个功能。所以你应该设置你的变量:
res.locals = variables_locales;
对于JADE模板,您可能必须将res.locals变量传递给渲染引擎:
res.render('index', {
locals: res.locals
});
然后像这样访问JADE中的变量:
p= locals.title