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。然后(…)
仍然不会等待
然后
的结果,并且会立即跳回:(