gpt4 book ai didi

javascript - Node.js Mongoose Promise 迷路了

转载 作者:行者123 更新时间:2023-11-30 15:01:50 25 4
gpt4 key购买 nike

我有一个带有 mongoDB 的 Node.js API。有一个创建用户并需要散列密码的路由,为此我使用 bcryptjs 包。

路线是这样的:

router.route('/user')

.post(function(req, res) {
if(req.body.password === req.body.passwordConfirm) {
userManager.addUser(req.body)
.then(function(response) { // waiting for the result of the mongoDB save
res.send({data:response});
});
} else {
res.send({err:'passwords do not match'});
}
})

和 userManager.addUSer:

this.addUser = function(userobject) {
bcrypt.genSalt(10, function(err, salt) { // generate a salt
if(err !== null) {
console.log(err);
} else {
bcrypt.hash(userobject.password_hash, salt, function(err, hash) { // hash pw
if(err !== null) {
console.log(err);
else {
userobject.password_hash = hash; // store hash in user obj
var user = new User(userobject);
return user.save().catch(function(err){ // save user in mongoDB
console.log(err);
});
}
});
}
});
};

我收到一条错误消息:“无法读取未定义的‘then’属性”,这告诉我我没有收到来自 addUser 的 promise 。我看了看,bcryptjs 可悲的是不使用 promise ,但是,mongoose 确实如此。(添加这个:

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

没有帮助)

我尝试使用 reject 和 resolve 将函数包装在一个 promise 中,但这给出了这个错误:“TypeError: Promise resolver undefined is not a function”。

我如何获得 mongoose 的 save() 函数返回到 post 路由中的 .then() 的 promise ?我尝试在两个 bcrypt 函数前添加 return 但这也不起作用..

欢迎提出任何建议!

最佳答案

你的 addUser函数永远不会将 promise 返回给它的调用者。你在做 return来自 bcrypt.hash回调函数,但这与 addUser 无关的返回值。

看起来像addUser必须使用一些不支持 Promise 的 API,所以你只能做 new Promise ,像这样(参见 *** 评论):

this.addUser = function(userobject) {
return new Promise(function(resolve, reject) { // ***
bcrypt.genSalt(10, function(err, salt) { // generate a salt
if(err !== null) {
reject(err); // ***
} else {
bcrypt.hash(userobject.password_hash, salt, function(err, hash) { // hash pw
if(err !== null) {
reject(err); // ***
else {
userobject.password_hash = hash; // store hash in user obj
var user = new User(userobject);
resolve(user.save()); // *** save user in mongoDB
}
});
}
});
});
};

另请注意,我没有 addUser只是吞下错误;相反,它们被传播给调用者。调用者应该处理它们(即使“处理”只是记录日志)。

关于javascript - Node.js Mongoose Promise 迷路了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46422171/

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