mongoose的承诺和蓝鸟

节点是否会有Promise的内置实现,或者我们应该采用其中一个主要的库? 如Q / Blueblird? 我有一个使用async.waterfall的代码,我想将其移动到使用承诺。 链接的函数之一是mongoosefindOne从mongoose4.0返回一个承诺,但我明白,混合承诺types是不好的做法,因为mongoose使用它自己的承诺的实现,我想用Q /蓝鸟。 我应该使用promsifyAllmongoose? 或将promisify将被弃用一旦承诺将在节点实施目前的代码是:

async.waterfall([ function(done){ User.findOne({ email: reco.mail }, done); }, function(receiverUser, done){ if (!receiverUser){ } else { } // send the model to mongoose to get verified and persisted reco.save(function (err) { if (err) { //handle error } return done(err); }); } ], function(err){ if (err) { console.error('unexpected error while creating reco', err); return res.status(500).send({}); } console.log('reco created successfully', reco); return res.status(201).send({}); }); 

我想把它改成().then.catch()样式

我build议你保持以下方式,至less我使用这种方法,它的工作原理。 请检查下面的代码示例。

 var Promise = require('bluebird'); //declaration userSchema.statics.search = function (query) { return new Promise(function(resolve, reject){ return mongoose.model('User') .find(query) .exec() .then(function(foundUsers){ resolve(foundUsers); }) .onReject(function(err){ reject(err); }); }); }; //using var UserModel = require('path/to/user/model'); UserModel .search(<query>) .then(function(foundUsers){ //do something }) .catch(function(err){ //so something }); //declaration userSchema.methods.saveMe = function () { var user = this; return new Promise(function (resolve, reject) { user.save(function (err) { if (err) { reject(err); } else { resolve(user); } }); }); }; //using var UserModel = require('path/to/user/model'); var newUser = new UserModel(newUserData); newUser .save(function(savedUser){ //do something }) .catch(function(err){ //so something }); 

当然,使用“Promisify”也有助于在这种情况下,但是有几次我遇到了问题,所以我决定将Mongoose的承诺转换为众所周知的格式。