如何从所有页面访问查询结果

时间:2017-10-31 20:10:44

标签: node.js templates express swig-template

我正在尝试将变量传递给我的模板,我可以让它适用于单个页面,但我需要找到一种方法来访问任何页面中的结果。原因是我的侧边栏需要它作为模板的一部分。

我的模板是

include header

include sidebar

content

include footer

这只是sudo代码,显然不是我的实际代码。

我需要包含的查询是:

Item.count({"author.id":req.user.id}, (err, itemCount)=>{
 if(err){
  console.log(err);
 } else {
  var Count = JSON.stringify(itemCount);
  // somehow I need to store Count to be accessible inside my sidebar
 }
});

我知道我可以把查询放在每个路由中,但有没有办法我只能为登录用户做这个并把它放在中间件或其他东西或者排序中?

我目前将它存储在每条路线中,但我知道它不是DRY代码,而且更新它将是一个巨大的痛苦,因为我有超过50条路线我处理。

我的典型路线是:

// dashboard
  app.get('/dashboard',
    setRender('dashboard/index'),
    setRedirect({auth: '/login'}),
    isAuthenticated,
    (req, res, next) => {

    },
    dashboard.getDefault);

1 个答案:

答案 0 :(得分:0)

您可以为此目的使用中间件,例如:

app.use('*', (req, res, next) => {
    Item.count({"author.id":req.user.id}, (err, itemCount)=>{
       if(err){
           console.log(err);
           res.status(500).send(err);
       } else {
          req.Count = JSON.stringify(itemCount);
          next();
       }
    });    
});

这将在所有路径中执行您的查询并将结果保存在req.Count中。如果您希望仅在某组路由中执行该操作,请修改'*'部分以查找您要匹配的任何路径。此外,您可能希望将其他中间件功能(如isAuthenticated)提取到自己的app.use子句中,以便更准确地管理订单。