【发布时间】:2018-03-07 10:11:20
【问题描述】:
我有一个带有 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 的承诺。我看了看,遗憾的是 bcryptjs 不使用承诺,但是,猫鼬会。 (添加这个:
var mongoose = require('mongoose').Promise = Promise;
没有帮助)
我尝试用reject 和resolve 将函数包装在一个promise 中,但这给出了这个错误:“TypeError: Promise resolver undefined is not a function”。
如何获得 mongoose 的 save() 函数返回到 post 路由中的 .then() 的承诺?我尝试在两个 bcrypt 函数前面添加 return ,但这也没有用..
欢迎提出任何建议!
【问题讨论】:
-
你没有从你的
this.addUser返回一个Promise。 -
要清楚,你不会从
this.addUser返回任何东西 -
@Jaromanda X 是的,我现在明白了,我是 Promise 的新手,我想我迷失了不支持 Promise 的 API..
标签: javascript node.js mongoose promise bcrypt