gpt4 book ai didi

node.js - 如何使用 Bluebird 处理 Mongoose 返回的 promise ?

转载 作者:太空宇宙 更新时间:2023-11-03 22:14:31 24 4
gpt4 key购买 nike

我有一个使用 Mongoose 定义的 Account 架构,我已经使用 Bluebird 设置了 promise :

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

我为这种模式设计了一个模型方法:

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

所以我得到了一个方法,它将尝试查找用户并检查密码匹配:

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属性。

这里我的目的是返回一个查找用户的 promise 并检查密码匹配,但是当我调用登录时:

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

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

最佳答案

你不能在调用 Promise 调用之前同时执行 return 操作: return Account.xxxxx AND 执行 .then() .... 它是一个或 ... 我给你两种选择。版本 A 我们处理登录函数本地的结果集:

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 中,我们将处理委托(delegate)给调用者来执行 .then() 逻辑:

function login (email,password) {

return Account.findOne({email: email});
}

所以在调用者中我们有:

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

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

mongoose.Promise = global.Promise;

请注意,findOne 返回一个文档,而执行 find 始终会给出包含 0 个或多个文档的数组

关于node.js - 如何使用 Bluebird 处理 Mongoose 返回的 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33401432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com