2016-11-21 53 views
0

我正在使用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}} 

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

当数据库更新时,推荐使用哪种方式来监视数据库更新和刷新导航对象?

+0

可能最合适的解决方案是触发每个数据库更新的导航结构更新,您可以使用WebSocket实现实时轮询。 http://socket.io/是一个很好的库,用于实时更新 – Andrii

回答

0

不要写发生器.navigation();在服务器启动。在nodejs中提供的钩子在请求/请求之后被触发,所以你可以使用这个钩子来调用generators.navigation()函数。正如Iam假设会有将导航项添加到数据库的函数。因此,只要请求完成,您可以在请求挂钩后调用generators.navigation()

+0

数据库由用PHP编写的完全不同的应用程序填充。 – Kunok

+1

在这种情况下,使中间件功能像 – AJS

+2

功能myMiddleware(REQ,水库,下一个){ 如果(req.method === 'GET'){// 做一些代码 } //继续执行路由器中间件 下一个() } app.use(myMiddleware)所以在这个函数中调用generators.navigation();所以它会触发你的每一个请求 – AJS