Node JS - res.locals 不是函数

Jos*_*igo 0 javascript middleware node.js express

在我的 Node js 应用程序中,我在某些路由中使用函数作为中间件。我通常使用 res.locals 作为 afunction以免覆盖该res.locals对象。但现在我更新了nodejs并表达到最新版本,我不知道为什么我收到以下错误:

\n\n
Unhandled rejection TypeError: res.locals is not a function\n    at /home/jose/workspace/tfg/server.js:116:8\n    at tryCatcher (/home/jose/workspace/tfg/node_modules/bluebird/js/release/util.js:11:23)\n    at Promise._settlePromiseFromHandler (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:491:31)\n    at Promise._settlePromise (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:548:18)\n    at Promise._settlePromise0 (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:593:10)\n    at Promise._settlePromises (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:672:18)\n    at Async._drainQueue (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:125:16)\n    at Async._drainQueues (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:135:10)\n    at Immediate.Async.drainQueues [as _onImmediate] (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:16:14)\n    at processImmediate [as _immediateCallback] (timers.js:383:17)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个中间件的作用如下所示:

\n\n
function middle_datos (req, res, next){\n\n    var id_usuario = req.user ? req.user._id : 'undefined';\n\n    // object to override res.locals\n    var variables_locales = {\n        ip: IP,\n        message: JSON.stringify({\n            error: req.flash('error'),\n            success: req.flash('success'),\n            info : req.flash('info'),\n        }),\n        title: 'Informa Torrent',\n        subtitle: 'La app con la que podr\xc3\xa1s contribuir a la mejora de Torrent.',\n        user: req.user, \n        id_usuario: id_usuario\n    };\n\n    db.query(queries.obtener_datos_app) // consultamos los datos de la app\n        .then (function(datos_app){\n\n            variables_locales.datos_app = datos_app; // obtenemos datos app\n\n            if (! req.user) throw new Error('no est\xc3\xa1s loggeado'); // Si no hay usuario conectado --> Continuamos adelante\n                                               // ya que no consultamos notificaciones ni acciones  \n\n            return db.query(queries.obtener_notificaciones, req.user._id); // consultamos notificaciones\n\n        })\n        .then(function(notificaciones){\n            // obtenemos notificaciones\n            variables_locales.mis_notificaciones = notificaciones; // ls pasamos al objeto res.locals\n\n            return db.query(queries.obtener_acciones, req.user._id); // consultamos acciones\n\n        })\n        .then (function(acciones){\n            // obtenemos acciones\n            variables_locales.mis_acciones = acciones;\n            res.locals(variables_locales); // Error\n            next(); // siguiente ruta o middleware\n        })\n        .catch(function (error) {\n            console.log('Error middleware ' + error); // print the error;\n            res.locals(variables_locales);\n            next(); // siguiente ruta o middleware\n        });\n\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么, res.locals 的问题是什么?

\n\n

另外,如果我尝试以这种方式将一些键值推送到 res.locals:

\n\n
res.locals.someKey = someValue;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我无法从我的玉模板访问该变量。

\n\n

任何帮助将不胜感激!

\n

Khô*_*hôi 5

res.locals不是一个函数。所以你应该像这样设置你的变量:

res.locals = variables_locales;
Run Code Online (Sandbox Code Playgroud)

对于 JADE 模板,您可能必须将 res.locals 变量传递给渲染引擎:

res.render('index', {
    locals: res.locals
});
Run Code Online (Sandbox Code Playgroud)

然后像这样访问 JADE 中的变量:

p= locals.title
Run Code Online (Sandbox Code Playgroud)