Node.js Mongoose:使用承诺作为其他函数的参数

Node.js Mongoose:使用承诺作为其他函数的参数,node.js,express,mongoose,promise,async.js,Node.js,Express,Mongoose,Promise,Async.js,我试图很好地理解如何使用承诺,主要是因为我想查询数据,然后使用该数据查询其他数据 我有这个模式: var serviceSchema = new Schema({ name: String, }); 这个方法是: serviceSchema.statics.getIdByName = function getIdByName (serviceName) { this.findOne({name :serviceName }).exec(function(err, service){

我试图很好地理解如何使用承诺,主要是因为我想查询数据,然后使用该数据查询其他数据

我有这个模式:

var serviceSchema = new Schema({
name: String,
});
这个方法是:

serviceSchema.statics.getIdByName = function getIdByName (serviceName) {

this.findOne({name :serviceName }).exec(function(err, service){
    if(err) console.log(err)

    return service._id

})
}
在我的代码中,我希望执行以下操作:

var service_id = Service.getIdByName("facebook")
otherSchema.findOne({service : service_id}).exec(...)
但是服务id是一个承诺,所以查询是不对的,我不想在回调地狱中,在回调内部调用模型等等 我尝试过使用类似的异步

async.series([getVariables], function(err, results){
otherSchema.findOne({service : service_id}).exec(...)})
其中getVariables是:

function getVariables(callback1) {
if(service_id!=undefined) {
    callback1(serviceID)
}}
任何关于如何实现这一点的帮助都是非常受欢迎的! 非常感谢

试试这个
exec()
返回承诺

serviceSchema.statics.getIdByName = function getIdByName(serviceName) {
    return this.findOne({
        name: serviceName
    }).exec();
}
调用getIdByName函数

Service.getIdByName("facebook").then((data) => {
    console.log(data)
})

这个问题的答案实际上是使用async/await和do var x=await Model.findOne().exec()


或者任何返回承诺的函数,那么您可以在代码中的任何地方使用x

非常感谢您的回答,这并不能解决我的问题,因为getIdByName现在只是一个findOne函数,我只能在“then”中访问服务的id,我想在“then”中访问它,存储在一个变量中,我可以将其作为参数传递给另一个查询,这是否意味着我只能在“then”内执行该操作?这不是很糟糕吗,因为事实上,我在做这个测试之前必须获得很多IDquery@mtths它不会创建回调地狱,因为您可以创建承诺链,而不是回调地狱。您尝试了什么?这里有一个更可读的版本:Service.findOne({name:'JollyClick'})。然后(函数(服务){var service\u id=service.\u id返回Data.findOne({name:'Objectifs}).exec()}).then(函数(数据){var objectifsID=Data.\u id返回Data.findOne({name:'Personnalité'}).exec()).then(函数(data2){var personnaliteID=data2.\u id DataUse.create({service:service\id,user:service\id,Data:dataTypesIds}),function(err,datause){}当我想在
外部创建文档时,无法访问服务id。然后
内部赋值。然后
var service\u id;service.findOne({name:'JollyClick'})。然后(函数(service){service\u id;=service.\u id返回数据。findOne({name:“Objectifs”}).exec();})