在 node.js 中使用 promise 链接数据库查询
chaining database queries using promise in node.js
我正在尝试使用 spread
方法来累积我在 thread 和 Q.js
中阅读的承诺结果。它适用于另一个代码块,但不适用于以下 app.get
示例。我想使用 Sequelize
和 mongoose
链接查询并将所有返回的数据传递给 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 中没有显示 "fail"。这是我的原始代码,但它正在遭受回调地狱的困扰。
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');
})
})
您可以尝试将它们用作代理:
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
});
});
如果您的项目中没有,Bluebird 已经可以通过 sequelize 获得。
或者,您不必将它们放在特定变量中:
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
});
});
我正在尝试使用 spread
方法来累积我在 thread 和 Q.js
中阅读的承诺结果。它适用于另一个代码块,但不适用于以下 app.get
示例。我想使用 Sequelize
和 mongoose
链接查询并将所有返回的数据传递给 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 中没有显示 "fail"。这是我的原始代码,但它正在遭受回调地狱的困扰。
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');
})
})
您可以尝试将它们用作代理:
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
});
});
如果您的项目中没有,Bluebird 已经可以通过 sequelize 获得。
或者,您不必将它们放在特定变量中:
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
});
});