2016-12-14 12 views
0

在我的server.js的app.get中,我從mongo db返回一個數據集,然後在將數據傳遞給它的同時呈現我的頁面。如圖所示res.render只有在多個數據查詢完成之後

波紋管:

//page load 
app.get('/', (req, res) => { 

    //find all data in test table 
    var articles; 
    db.collection('test').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     articles = result 

      // renders index.ejs and passes result to quotes 
     res.render('./pages/index.ejs', { 
      quotes: articles 
     }) 
    }) 
}) 

我希望能夠把多個數據庫查詢,然後通過數據的多個變量對我回報,我的問題是,當我把我的res.render在數據庫查詢之外,它試圖在數據庫獲取其數據集之前進行渲染。

看看我試過波紋管:

//page load 
app.get('/', (req, res) => { 

    //find all data in test table 
    var articles; 
    db.collection('test').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     articles = result 
    }) 

     // renders index.ejs and passes result to quotes 
     res.render('./pages/index.ejs', { 
      quotes: articles 
     }) 
}) 

我的問題是:

我怎麼能確保渲染恰好我的數據庫查詢已經運行後ONLY和返回數據到一個變量?


最後,我希望能夠做這樣的事情:

//page load 
app.get('/', (req, res) => { 

    //find all data in table 1 
    var AAA; 
    db.collection('test1').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     AAA = result 
    }) 

    //find all data in table 2 
    var BBB; 
    db.collection('test2').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     BBB = result 
    }) 

    //find all data in table 3 
    var CCC; 
    db.collection('test3').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     CCC = result 
    }) 

     // renders index.ejs and passes result to quotes 
     res.render('./pages/index.ejs', { 
      quotes: AAA, 
      quotes2: BBB, 
      quotes3: CCC 
     }) 
}) 

任何幫助或建議在此表示讚賞。先謝謝你。

+0

如果你使用的是本地mongodb客戶端,那麼不要傳遞迴調函數,所以它返回promise,然後使用'then',執行一個查詢,將結果賦值給一個外部變量,然後再賦值一個'then',執行一個查詢等。 – jstice4all

+0

第一個查詢將是理想的,但我希望能夠執行多個查詢,然後將所有結果傳遞到最終的渲染中,請參閱編輯。 @ jstice4all –

+0

我編輯了我的評論。 – jstice4all

回答

2

試試這個代碼,這不是測試,但我認爲它應該工作:

app.get('/', (req, res) => { 

    var list = {}; 

    db.collection('test').find().toArray().then(result => { 
     list.result = result; 
    }).then(() => { 
     return Promise.resolve(db.collection('foo').find().toArray()); 
    }).then(result2 => { 
     list.result2 = result2; 
    }).then(() => { 
     return Promise.resolve(db.collection('bar').find().toArray()); 
    }).then(result3 => { 
     list.result3 = result3; 
    }).then(() => { 
     res.render('./pages/index.ejs', list); 
    }).catch(e => { 
     console.error(e); 
    }); 

}); 

更新:我們可以使用異步/指日可待返回無極的任何方法,因此代碼將是清潔:

// you can use express-async-errors package to make routes async 
app.get('/', async(req, res) => { 
    let list = []; 
    list.result = await db.collection('test').find().toArray(); 
    list.result2 = await db.collection('foo').find().toArray(); 
    list.result3 = await db.collection('bar').find().toArray(); 
    res.render('./pages/index.ejs', list); 
}); 
+0

我更新了答案。請檢查這是否工作。 – jstice4all

1

您可以使用async模塊。對於相互獨立的函數使用async.parallel,對依賴進程使用async.series。檢查async

相關問題