猫鼬:在 find() 之后填充
Mongoose: Populate after find()
我是 mongo 和 node js 的新手,这是我正在尝试做的事情:
API 是根据查询检查数据库中是否存在现有条目。
- (a) 如果没有现有文档,创建一个新文档,填充,发送到
客户。
- (b) 如果文档存在,return 文档,填充,发送到
客户。
问题: 在场景 (a) 中,在创建文档后,API 将 "null" 发送到客户端。
怀疑: .populate() & .exec() 在 API 完成创建新文档之前运行。代码片段 returns null:
console.log('Inside IF' + video_res); // returns null
解决此问题的最佳方法是什么?
model_video.findOne( video_entry,
function(err, video_req) { // Send Back Object ID
if (err) res.send(err);
if (!video_req) { // Does not work
console.log('-----STATUS : No Video Found');
model_video.create(video_entry, function(err, video_res) {
console.log('Call back activated');
if (err) res.send(err);
console.log('Response is ' + video_res);
return video_res; // Does not work here!
}); // Ends - Create
console.log('Inside IF ' + video_res);
}
else { // Works
console.log('-----STATUS : Video Found')
if (err) return res.send(err);
var video_res = video_req;
console.log('Response is ' + video_res);
return video_res;
};
})
.populate('_chirps')
.exec(function(err, video_res) {
if (err) return res.send(err);
res.json(video_res);
console.log('Final Output is ' + video_res)
});
};
非常感谢您的帮助!
回调 exec() 回调会在您的 .findOne 查询后立即执行,您需要将其余代码放入该回调中。我重构了您的代码,使其更符合您的要求。
model_video.findOne(video_entry)
.populate('_chirps')
.exec(function(err, video_res) {
if (err) return res.send(err);
if (video_res) {
console.log('-----STATUS : Video Found')
console.log('Response is ' + video_res);
res.json(video_res)
}
else {
console.log('-----STATUS : No Video Found');
model_video.create(video_entry, function(err, new_video_res) {
if (err) return res.send(err);
console.log('Response is ' + new_video_res);
res.json(new_video_res);
});
}
})
我是 mongo 和 node js 的新手,这是我正在尝试做的事情:
API 是根据查询检查数据库中是否存在现有条目。
- (a) 如果没有现有文档,创建一个新文档,填充,发送到 客户。
- (b) 如果文档存在,return 文档,填充,发送到 客户。
问题: 在场景 (a) 中,在创建文档后,API 将 "null" 发送到客户端。
怀疑: .populate() & .exec() 在 API 完成创建新文档之前运行。代码片段 returns null:
console.log('Inside IF' + video_res); // returns null
解决此问题的最佳方法是什么?
model_video.findOne( video_entry,
function(err, video_req) { // Send Back Object ID
if (err) res.send(err);
if (!video_req) { // Does not work
console.log('-----STATUS : No Video Found');
model_video.create(video_entry, function(err, video_res) {
console.log('Call back activated');
if (err) res.send(err);
console.log('Response is ' + video_res);
return video_res; // Does not work here!
}); // Ends - Create
console.log('Inside IF ' + video_res);
}
else { // Works
console.log('-----STATUS : Video Found')
if (err) return res.send(err);
var video_res = video_req;
console.log('Response is ' + video_res);
return video_res;
};
})
.populate('_chirps')
.exec(function(err, video_res) {
if (err) return res.send(err);
res.json(video_res);
console.log('Final Output is ' + video_res)
});
};
非常感谢您的帮助!
回调 exec() 回调会在您的 .findOne 查询后立即执行,您需要将其余代码放入该回调中。我重构了您的代码,使其更符合您的要求。
model_video.findOne(video_entry)
.populate('_chirps')
.exec(function(err, video_res) {
if (err) return res.send(err);
if (video_res) {
console.log('-----STATUS : Video Found')
console.log('Response is ' + video_res);
res.json(video_res)
}
else {
console.log('-----STATUS : No Video Found');
model_video.create(video_entry, function(err, new_video_res) {
if (err) return res.send(err);
console.log('Response is ' + new_video_res);
res.json(new_video_res);
});
}
})