Node.js 如何通过mongoose find返回文档?
在我的应用程序中,我使用猫鼬和蓝鸟,如下所示:Node.js 如何通过mongoose find返回文档?,node.js,mongodb,mongoose,bluebird,Node.js,Mongodb,Mongoose,Bluebird,在我的应用程序中,我使用猫鼬和蓝鸟,如下所示: var mongoose = require('mongoose'); mongoose.Promise = require('bluebird'); appointment_is_available: function(appointment) { var appointments = dbcon.get_intersecting_appointment(appointment); //... } 在同一个文
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
appointment_is_available: function(appointment) {
var appointments = dbcon.get_intersecting_appointment(appointment);
//...
}
在同一个文件中,我拥有一个搜索“约会”的功能——数据库中的文档。该函数的返回应该是找到的文档的结果数组,而不是承诺、查询或其他内容
但不幸的是,程序似乎会在承诺实现之前跳回调用函数。那我怎么处理呢
以下是我在当前状态下的函数:
get_intersecting_appointment: function(appointment) {
var appointmentQuery = AppointmentModel.find({
$and: [{
begin: {
$lte: appointment.begin
}
},
{
end: {
$gte: appointment.end
}
}
]
});
return appointmentQuery.then(function(appointments) {
debug("Found appointments:");
debug(appointments);
if (appointments) {
return appointments;
} else {
return [];
}
});
},
提示:调用函数在内部调试(“找到约会”)
之前打印“下一个调试输出”;从上面。比方说,调用函数如下所示:
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
appointment_is_available: function(appointment) {
var appointments = dbcon.get_intersecting_appointment(appointment);
//...
}
根据
Node.js
nature,您可以使用回调来解决此类问题
使用回调
根据您的代码,我尝试添加回调
get_intersecting_appointment: function(appointment,callback) {
var appointmentQuery = AppointmentModel.find({
$and: [{
begin: {
$lte: appointment.begin
}
}, {
end: {
$gte: appointment.end
}
}]
});
return appointmentQuery.then(function(appointments) {
debug("Found appointments:");
debug(appointments);
if (appointments) {
callback(null,appointments);
} else {
callback(null,[]);
}
});
},
//在调用回调函数时添加回调函数
appointment_is_available: function(appointment) {
var appointments = dbcon.get_intersecting_appointment(appointment,function(err,result){
if(!err){
consoole.log(result)
}
});
//...
}
更新
您也可以使用Promise
或
将上述代码替换为以下代码
var appointmentQuery = AppointmentModel.find({
$and: [{
begin: {
$lte: appointment.begin
}
},
{
end: {
$gte: appointment.end
}
}
]
}).exec();
注意-在每次mongoose操作后使用.exec()
是一种很好的做法,以保证使用它。因为.exec()
返回一个挂起的承诺
现在,使用此函数的地方类似于var appointment=dbcon.get\u intersecting\u appointment(appointment)代码>。请参见此处dbcon.get\u intersecting\u appointment(appointment)
这将返回一个承诺,您将该承诺分配给一个变量,并且它是异步的,因此在这完成之前将执行下一行。还有一件事,从.then()
返回的值只能在另一个链接的内部访问。不能简单地将从.then()
返回的值赋给全局变量。您必须链接另一个,然后才能利用该值。您需要在调用dbcon的地方稍作修改。获取交叉约会(约会)
。你需要这样做
dbcon.get_intersecting_appointment(appointment).then(function(res){
//res is either empty array or the result array
//rest of your code here
})
即使这可以正常工作,我还是希望代码去异步,因为调用函数将被另一个函数调用,我只是想避免构建传递回调的长函数链。此外,我还必须在appointment\u is\u available
函数中查看结果,因为我只想从中返回一个布尔值。如果我只得到一个回调函数,那么函数将在调用回调函数之前返回,所以这里也有同样的问题(没有办法等待像“than”或IMHO之类的回调函数),因此,您可以使用Promise
或Yeah,这就是原始问题:我上面的示例使用Promise和then方法,但它不会等待then(…)的结果,然后再返回调用函数,这不是我所期望的行为。那么我怎么能在这里等待承诺的实现呢?根据你的代码,你的外部函数不是承诺,这就是为什么外部函数之前要执行的原因。您也可以做出承诺,但我不会处理调用函数中的任何承诺,而只是解决get\u intersecting\u appointment
函数中的所有承诺或查询,因此我将在appointment\u可用时获取真实文档。调用函数不应该处理任何承诺行为,而应该只处理具体数据。我也尝试过这种方法,但它会产生与我问题中的版本相同的行为。这很奇怪,因为exec()确实返回了一个promise,但是行返回appointmentQuery。然后(…)
仍然不会等待然后
的结果,并且会立即跳回:(