使用node.js中的promise链接数据库查询

时间:2015-01-11 08:23:30

标签: javascript database node.js callback promise

我尝试使用spread方法累积我在此thread中使用Q.js阅读的承诺结果。它适用于另一个代码块,但不适用于以下app.get示例。我想使用Sequelizemongoose链接查询,并将所有返回的数据传递给spread方法。这是我的尝试:

var db = require('./db/managedb'); // Sequelize
var mongo_models = require('./db/mongo_model')(mongoose);
var WB = mongo_models.Webdata,
Est = mongo_models.Estimate;

app.get('/p/:tagId', function(req, res){ 
   var filename = req.param("tagId");
   var mysql = db.db.query('CALL procedure()').then(function(rows) {
      console.log(rows);
   });  // Sequelize

   var nosql = WB.find().exec(function(err,k){
      console.log(k);
   }) // Mongoose

   var nosql2 = Est.find().exec(function(err,la){
      console.log(la);
   }) // Mongoose

   Q.try(function(){
       return mysql
    }).then(function(mysqls){
       return [ mysqls,nosql]
    }).then(function(mysqls,nosqls){
       return [mysqls,nosqls,nosql2]
    }).spread(function(mysqls,nosqls,nosql2s){
       res.render(filename+'.html', {my:mysqls,wb:nosqls,est:nosql2s}) 
    }).catch(function(error){ 
       console.log('fail')   
   })
})

我只是得到一个Cannot GET /p/5的空白页面而且没有"失败"显示在console.log中。这是我的原始代码有效,但它遭受了回调地狱。

app.get('/p/:tagId', function(req, res){ 
   var filename = req.param("tagId");
   db.db.query('CALL procedure()').then(function(rows) {
     WB.find().exec(function(err,wb){
       Est.find().exec(function(err,est){
         res.render(filename+'.html', {my:rows,wb:wb,est:est}) 
       }) 
     })
  }).catch(function (error) {
     console.log('own: database error');
   })
})

1 个答案:

答案 0 :(得分:1)

您可以尝试将它们用作代理:

app.get('/p/:tagId', function(req, res){ 
   var filename = req.param("tagId");
   var rows = db.db.query('CALL procedure()');
   var wb = WB.find().exec();
   var est = Est.find().exec();
   Promise.props({my: rows, wb: wb, est: est}).then(function(obj){
       res.render(filename+'.html', obj) 
   }).catch(function (error) {
     console.log('own: database error'); // not sure I'd just supress it
   });
});
如果你没有在项目中拥有它,那么蓝鸟已经可以通过续集获得。

或者,您不必将它们放在特定的变量中:

app.get('/p/:tagId', function(req, res){ 
   var filename = req.param("tagId");
   Promise.props({
       my:  db.db.query('CALL procedure()'), 
       wb: WB.find().exec(), 
       est: Est.find().exec()
   }).then(function(obj){
       res.render(filename+'.html', obj); 
   }).catch(function (error) {
     console.log('own: database error'); // not sure I'd just supress it
   });
});