我正在尝试使用express将多个Sequelize查询的结果显示到一个页面。但是,我无法从一个模型内函数返回数据。我很确定这与我没有正确理解javascript中的promises以及对异步编程的误解有关。
在我的report_ty模型中,我有这个功能:
report_ty.getTopFreedomIndex = function(){
report_ty.findAll({
raw: true,
limit: 10,
attributes: ['Country','Freedom'],
order: [['Freedom', 'DESC']]
}).then(topfreedomindex => {
console.log(topfreedomindex);
return topfreedomindex;
})
};
在我的控制器中,我试图从该查询中获取数据并以JSON格式将其发送到页面。
var db = require('../models/index.js');
module.exports.index_get = (req, res, next) => {
var topFreedomIndexPromise = new Promise ((resolve, reject) => {
db.report_ty.getTopFreedomIndex(err, topfreedomindex) => {
if(err){
return reject(err);
} else {
return resolve(topfreedomindex);
}
}
})
Promise.all([topFreedomIndexPromise]).then((results)=>{
return res.render('index', {topfreedomindex:topfreedomindex});
}).catch((err) => {
return next(err);
})
}
我想创建多个promises并将它们兑现给我可以呈现给页面的变量。
但是,控制器中的代码无法正常工作,因为控制台显示语法错误:意外“。”在db之后。我现在有点失去了如何去做这件事。我将此代码建模在以前使用mongoose和mongoDB的项目代码上。
如果我将findAll代码移动到控制器,我可以使它工作,但在这种情况下我只能运行一个查询。我想运行很多并将模型留在模型中。
非常感谢任何帮助/建议/批评。谢谢!
答案 0 :(得分:0)
<强>更新强>
我已经弄明白了!代码应如下所示:
型号:
report_ty.getBtmFreedomIndex = function(){
return report_ty.findAll({
raw: true,
limit: 10,
attributes: ['Country','Freedom'],
order: [['Freedom', 'ASC']]
})
};
控制器:
var topFreedomIndexPromise = db.report_ty.getTopFreedomIndex();
var btmFreedomIndexPromise = db.report_ty.getBtmFreedomIndex();
Promise.all([topFreedomIndexPromise, btmFreedomIndexPromise]).then((results)=>{
console.log(results);
return res.render('index', {
topfreedomindex: results[0],
btmfreedomindex: results[1]
});
}).catch((err) => {
return next(err);
});