首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在快递中呈现从app.js到所有路由的公共变量

如何在快递中呈现从app.js到所有路由的公共变量
EN

Stack Overflow用户
提问于 2015-03-13 07:08:36
回答 4查看 6.5K关注 0票数 6

在我的Node.js应用程序中,呈现或每条路由都是common.There的一些变量大约是4-5个变量,它们在每个路由上呈现。我有大约20条路线。

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

是否有一种方法可以将这些公共变量传递到每个路由都使用的某个地方‘(eg:app.js)’,这样我就可以稍微清理代码了。

我使用express.js作为节点,handlebars作为模板。

编辑:我想我应该再解释一点。

代码语言:javascript
复制
res.render('abc', {
                        commonitem1: 'one',
                        commonitem2: 'two',
                        ...
                   });

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

我想避免这种重复在我的每一个路线,并希望呈现它从一个共同的地方。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-13 10:09:11

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

  • 使用app.use存储值:

在您的app.js中添加一个为您执行此操作的中间件。请记住在您定义的任何其他路由之前编写此中间件,因为中间件功能是按顺序执行的。

代码语言:javascript
复制
app.use(function(req, res, next){
    res.locals.items = "Value";
    next();
});
//your routes follow
app.use(‘/’, home);

在您的路由中,您可以将items直接放置在res.render中,例如:

代码语言:javascript
复制
res.render('layout', {title: 'My awesome title',view: 'home', item :res.locals.items });
  • 使用快捷会话存储值:

如果您安装了快速会话,您可以将一些数据保存在req.session.item中,并将它们放置在任何路由中,如:

代码语言:javascript
复制
res.render('layout', {title: 'My awesome title',view: 'home', item :req.session.items });
票数 7
EN

Stack Overflow用户

发布于 2015-03-13 09:00:09

看起来,res.locals就是您要寻找的对象--每个请求都会将这个对象传递给您的视图,并将其范围限定为每个单独的请求(也就是说,每个请求都可以有自己的res.locals版本)。还有app.locals,它为所有请求共享。

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

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

票数 4
EN

Stack Overflow用户

发布于 2018-08-06 02:31:18

代码语言:javascript
复制
// 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)
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29026650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档