- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 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/
我是一名优秀的程序员,十分优秀!