如何将app.js中的常用variables渲染到所有的express中

在我的Node.js应用程序中,一些渲染variables或每条路线是常见的。每条路线上都有大约4-5个variables。 我有大约20条路线。

目前我正在做res.render每个路由中的这些variables

有没有一种方法可以将这些常用variables传递给每个路由正在使用的某个地方(比如:app.js),以便我可以清理一下我的代码。

我使用express.js作为模板的节点和handlebars

编辑:我想我应该多解释一下

 res.render('abc', { commonitem1: 'one', commonitem2: 'two', ... }); ------------------------------------- another route res.render('xyz', { commonitem1: 'one', commonitem2: 'two', ... }); 

我想避免在我的每一条路线上重复这一点,并想从一个共同的地方渲染它。

对于会话或请求相关的值,您可以将这些常用值存储在全局variables中,然后直接在res.render中使用它们。 要做到这一点,你有以下选项

  • 使用app.use来存储值:

在你的app.js中添加一个为你做这个的中间件。 请记住在定义任何其他路由之前编写这个中间件,因为中间件function是按顺序执行的。

 app.use(function(req, res, next){ res.locals.items = "Value"; next(); }); //your routes follow app.use('/', home); 

在你的路线中,你可以直接把items放在res.render中,例如:

 res.render('layout', {title: 'My awesome title',view: 'home', item :res.locals.items }); 
  • 使用快速会话来存储值:

如果您安装了快速会话,则可以将一些数据保存在req.session.item ,并将其放置在以下path中:

 res.render('layout', {title: 'My awesome title',view: 'home', item :req.session.items }); 

看起来res.locals就是你正在寻找的东西 – 这个对象被传递给每个请求的视图,并被限制在每个单独的请求(即每个请求可以有自己的res.locals版本)。 还有app.locals是所有请求共享的。

我没有这方面的实际经验,但是你可以使用这个对象来传递所有的variables到你的视图,或者Express可以将app.locals任何东西与res.locals合并,并通过res.render() 。 请仔细testing,我还没有在官方文档中find关于合并行为的相关信息。

至于填充res.locals ,为了保持代码干爽 ,你可以编写一个自定义的中间件 ,在你的实际路由逻辑被执行之前,用你需要的任何东西填充对象。

你可以用下面的代码创build一个constants.js文件

 (function (constants) { var FetchDataErrorMessage = "Error while fetching User Data"; var ConnectionErroMessage = "Error while fetching Connecting Server"; var InsertDataErrorMessage = "Error while inserting User Data"; var RemoveDataErrorMessage = "Error while removing User Data"; var UpdateDataErrorMessage = "Error while updating User Data"; })(module.exports); 

在任何需要使用这些variables的文件中,您可以添加下面的代码。

 var constants = require('constants'); console.write(constants.RemoveDataErrorMessage); 

输出: – “删除用户数据时出错”