【发布时间】:2018-10-03 00:42:05
【问题描述】:
我正在尝试使用 express 将多个 Sequelize 查询的结果显示到一页。但是,我无法从一个模型内函数返回数据。我很确定这与我对 javascript 中的 Promise 没有正确理解以及对异步编程的误解有关。
在我的 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);
})
}
我想创建多个 Promise 并将它们兑现为我可以呈现到页面的变量。
但是,控制器中的代码不起作用,因为控制台说存在语法错误:意外'。'分贝后。我目前对如何去做这件事有点迷茫。我在以前项目的代码上建模了这段代码,该代码使用了 mongoose 和 mongoDB。
如果我将 findAll 代码移动到控制器,我可以让它工作,但在这种情况下我只能运行一个查询。我想运行很多并将逻辑留在模型中。
非常感谢任何帮助/建议/批评。谢谢!
【问题讨论】:
-
console.log(db)的输出是什么。您的模型相对路径是否正确?此外,在您的函数getTopFreedomIndex中,您应该return否则如果未定义 -
谢谢阿比纳夫。 db 对象是我的所有模型的集合,其中 db.report_ty 是我的 report_ty 模型。 db 的 console.log 仅输出 sequelize 连接详细信息和相关模型。不过,添加一个返回到该函数有帮助!我现在可以在我的控制器中为我的函数添加一个 .then 方法并将其分配给一个变量。我的下一个问题是:我将如何在一个 Promise.all 中关闭所有这些并将它们传递到页面?还是有另一种更清洁的方法来做到这一点?而不是使用 Promise.all?再次感谢。
-
很好,它有帮助。你想用不同的参数多次调用
getTopFreedomIndex? -
我想调用不同的函数,例如 getBtmFreedomIndex,它会使用与所列函数类似的另一个函数来运行不同的查询。我会在控制器中调用它们,然后 res.send 所有变量。如果我尝试将函数的返回值存储在变量中,它会给我一个未实现的承诺对象而不是数据集。
-
@AbhinavD 我想通了! promise 变量应如下所示: var topFreedomIndexPromise = db.report_ty.getTopFreedomIndex();` 控制器代码应为:
Promise.all([topFreedomIndexPromise]).then((results)=>{ console.log(results); return res.render('index', { topfreedomindex: results[0] }); }).catch((err) => { return next(err); });谢谢大家的帮助!
标签: node.js express promise sequelize.js