2016-11-21 52 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