Express - 数据库内容更改时刷新视图变量

时间:2016-11-21 10:50:00

标签: javascript node.js express

我正在使用Express,我正在从数据库生成页面。在服务器启动时,我有导航生成。

此块在服务器启动时执行:

database.connect()
        .then(() => {
          generators.navigation();
        })
        .catch(err => {
          console.log(err);
          process.exit();
        });

我有这个生成导航的代码:

generators.navigation = function(){
  var db = require('./database.js').db;
  var data = db.collection('navigation').find({},{_id:0,path:1,title:1});
  var nav = []
  data.on('data', doc => {
    nav.push(doc)
  })
  data.on('end', () => {
    generators.navigation = nav;
  })
}

然后在页面渲染中使用:

for (let page of pages) {
  if(req.params.path === page.path){
    res.render(page.type, {
      page:page,
      navigation:generators.navigation,
      helpers:helpers
    });
  }//if
}//for

在我看来(使用把手):

{{#if_eq page.contents.nav.type 'default'}}
  {{#each navigation}}
    <a class="item no-mobile" href="{{this.path}}">{{this.title}}</a>
  {{/each}}
{{/if_eq}}

问题是,当新对象插入数据库时​​,这不会更新导航,因为此代码仅在服务器启动时执行,并且需要重新启动服务器才能读取新的更改数据库。

在数据库更新时,建议使用哪种方法来监视数据库更新并刷新导航对象?

1 个答案:

答案 0 :(得分:0)

不要编写generators.navigation();在服务器启动。 nodejs中提供的钩子在请求/请求之前被触发,因此您可以使用此钩子来调用generators.navigation()函数。正如iam假设将在函数上添加导航项到数据库。因此,只要该请求完成,您就可以在请求挂钩

之后调用该请求中的generators.navigation()