Node.js 如何将app.js中的公共变量呈现到express中的所有路由

Node.js 如何将app.js中的公共变量呈现到express中的所有路由,node.js,express,handlebars.js,Node.js,Express,Handlebars.js,在我的Node.js应用程序中,一些渲染或每个路由的变量是常见的。每个路由上大约有4-5个渲染变量。我有大约20条路线 目前,我正在res.render中的每个路由中传递这些变量 有没有一种方法可以让我在某个地方传递这些公共变量(例如:app.js)`每个路由都在使用这些变量,这样我就可以稍微整理一下我的代码 我对节点使用express.js,对模板使用handlebar 编辑:我想我应该多解释一下 res.render('abc', { comm

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

目前,我正在
res.render中的每个路由中传递这些变量

有没有一种方法可以让我在某个地方传递这些公共变量(例如:app.js)`每个路由都在使用这些变量,这样我就可以稍微整理一下我的代码

我对节点使用
express.js
,对模板使用
handlebar

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

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

-------------------------------------
another route
res.render('xyz', {
                        commonitem1: 'one',
                        commonitem2: 'two',
                        ...
                   });
我希望避免在我的every routes中重复此操作,并希望从一个公共位置渲染它。

这似乎就是您要寻找的-此对象将传递给每个请求的视图,并限定于每个单独请求的范围(即每个请求都可以有其自己版本的
res.locals
)。还有
app.locals
,可供所有请求共享

我没有这方面的实际经验,但您可以使用此对象将所有变量传递给您的视图,或者Express会将
app.locals
中的任何内容与
res.locals
以及通过
res.render()发送到视图的内容合并。请仔细测试,我在官方文件中没有找到关于合并行为的相关信息


至于填充
res.locals
,为了保留代码,您可以编写一个脚本,在执行实际路由逻辑之前,使用您需要的任何内容填充对象。

您可以使用以下代码创建一个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);
在需要使用这些变量的任何文件中,都可以添加以下代码

var constants = require('constants');    
console.write(constants.RemoveDataErrorMessage);   
输出:-“删除用户数据时出错”


对于会话或请求相关值,可以将这些公共值存储在全局变量中,然后直接在res.render中使用它们。为此,您有以下选项

  • 使用app.Use存储值:
在app.js中添加一个中间件,它可以为您实现这一点。记住在定义任何其他路由之前编写此中间件,因为中间件功能是按顺序执行的

app.use(function(req, res, next){
    res.locals.items = "Value";
    next();
});
//your routes follow
app.use(‘/’, home);
在路由中,您可以将
项直接放置在res.render中,如下所示:

res.render('layout', {title: 'My awesome title',view: 'home', item :res.locals.items });
  • 使用express会话存储值:
如果您安装了express session,您可以将一些数据保存在
req.session.item
中,并将其放置在任何路径中,如:

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

我想你可以用这个:
app.set(“someOptions”,“value”)并使用app.get(“someOption”)检索我的问题在于没有在每一条路线上都获得价值。我从一个全局文件中获取它,在这个文件中我设置了公共变量。但是为了在我的模板中获得值,我在每个路径的
res.render
中传递它。我想避免它,从一个普通的地方做它;您希望布局中的一些公共元素(如侧边栏菜单)一次生成,并在多个页面中使用,而无需重新要求值。所以,呈现“主页”会调用“侧边栏”,它获取所需的值并嵌入到“主页”中。(思考)使用
res.locals
。创建一个函数,该函数在需要公共变量的路由之前调用。在该函数中,分配
res.locals.varname
一些值。在您的布局中,您现在可以使用
varname
。感谢您向我介绍res.locals:)您没有导出任何内容。。。另外请注意,Node.js中没有必要将模块封装在s中,Node会为您这样做。您能否在回答时尝试正确格式化代码,并解释代码如何解决OP遇到的问题?
// I created common func for all routes as below.

function commonRes(layout, req, res) {

  if (req.session.user) {
    res.render(layout, {
      user: req.session.user
      //csrfToken: req.csrfToken() // csrf 
    })

  } else {
    res.render(layout, {
      user: null,
      csrfToken: null
    })
  }

  return res.end()
}



// and apply it to all routes simply as below



app.get('/', (req, res) => {

  return commonRes('index.html', req, res)

})

app.get('/new', (req, res) => {

  return commonRes('new.html', req, res)
})