如何处理使用蓝鸟的Mongoose返回的诺言?

我有一个Account架构,用Mongoose定义,我已经设置了蓝鸟的承诺:

 var mongoose = require('mongoose'); mongoose.Promise = require('bluebird'); 

我为这样的模式devise了一个模型方法:

 accountSchema.methods.validPassword = function(password) { return bcrypt.compareSync(password, this.password); } 

所以我得到了一个方法,试图find一个用户,并检查密码匹配:

 function login (email,password) { return Account.findOne({email: email}).then(function (user) { console.log(user); user["match"] = user.validPassword(password); console.log(user); return user.validPassword(password); }); } 

奇怪的是,第二个console.log不会显示对象的任何match属性。

在这里,我的意图是返回一个查找用户和检查密码匹配的承诺 ,但是当我调用login时:

 login("email","password").then(function(user){...}) 

用户没有匹配属性,我怎么能实现它?

在调用Promise调用之前,你不能同时做两个return:return Account.xxxxx 并且做一个.then()…它的一个或者…我给你两个select。 版本A我们处理结果集本地loginfunction:

 function login (email,password) { // notice I no longer have return Account.xxxx Account.findOne({email: email}) // Account.findOne returns a Promise .then(function (user) { if (user) { user.match = user.validPassword(password); // execute some callback here or return new Promise for follow-on logic } else { // document not found deal with this } }).catch(function(err) { // handle error }); } 

来电者在这里:

 login("email","password") // needs either a cb or promise .then(function(userProcessed) { ... }). 

…在版本B中,我们将处理调用为调用.then()逻辑:

 function login (email,password) { return Account.findOne({email: email}); } 

所以在调用者,我们有:

 login("email","password").then(function(userNotProcessed){...}) 

findOne获得结果集后,对user执行一些validation,避免假设find它。 此外,由于Promise现在在ES6中,您可以使用内置的Promise实现

 mongoose.Promise = global.Promise; 

注意一个findOne返回一个文档,而做一个find总是给你一个0或更多文档的数组,

 login(email,password){ return new Promise(function(resolve,reject){ Account.findOne({email: email}).then(function (user) { user.match = user.validPassword(password); resolve(user) }); }) }