我使用MongoDB数据库执行任务,并尝试使用task_rating:“ OK”查找所有任务,并将结果归入一个列表,并将所有任务评级为“ NOK”的任务归入第二个列表,最后将其呈现为我的HTML作为两个信息列表。
问题是,当我想将查找结果作为列表返回到外部值时,它总是返回一个怪异的猫鼬对象。
我的代码:
app.get("/", function(req, res) {
var nok_l = tasks.find({ task_rating: "NOK" }, (err, nokTasks) => {
if (err)
console.log(err);
else {
return nokTasks;
}
});
var ok_l = tasks.find({ task_rating: "OK" }, (err, okTasks) => {
if (err)
console.log(err);
else {
return okTasks;
}
});
console.log(ok_l);
res.render("tasks", {
ok_l: ok_l,
nok_l: nok_l
});
});
console.log打印的结果是猫鼬的混杂对象,而不是我的列表。
谢谢。
答案 0 :(得分:0)
问题是您正在打印猫鼬的诺言对象,而不是返回的数据,因为Mongoose#find是异步的。
有许多方法可以处理这种情况,但是最基本的“教学法”是在解决诺言后仅仅返回数据:
app.get("/", function(req, res) {
tasks.find({task_rating: "NOK"}, (err, nokTasks) => {
if (!err) {
tasks.find({task_rating: "OK"}, (err, okTasks) => {
if (!err) {
res.render("tasks", {
ok_l: okTasks,
nok_l: nokTasks
});
}
});
}
});
});
但是,如果我们存储promises引用并使用Promise#all解决所有问题,则可以更好地构建此堆栈:
app.get("/", function(req, res) {
let promises = [];
promises.push(tasks.find({task_rating: "NOK"}).exec());
promises.push(tasks.find({task_rating: "OK"}).exec());
Promise.all(promises).then( (allTasks) => {
// here it's necessary to handle the "OK" and "NOK" lists
res.render("tasks", {
list: allTasks
});
});
});