【发布时间】:2018-11-06 03:34:17
【问题描述】:
我正在使用 mongodb 和节点创建用户创建页面。获得姓名、电子邮件和密码后,我尝试对密码进行哈希处理,然后保存到 mongodb。我本可以通过使用 async 和 await 来遵循最佳实践。但是我想更多地了解 Promise。所以,我尝试了以下方法,但在某些时候我被卡住了。在这里,使用 bcrypt 安全地提取密码,步骤是 1)bcrypt.getSalt 2)bcrypt.hash 3)使用新密码创建用户 4)将其保存到 mongodb。如果您查看以下代码,则这些步骤是通过这些步骤实现的。但是,将用户保存到 mongodb 时,用户超出范围。我的问题是如何使用 Promise 以正确的方式实现它们。你能给我一些很好的例子吗?我是初学者程序员,所以只想向专家学习。所以我来发这个。
router.post("/", (req, res, next) => {
bcrypt
.genSalt(10)
.then(salt => {
console.log(`Salt: ${salt}`);
return bcrypt.hash(req.body.password, salt);
})
.then(hash => {
console.log(`Hash: ${hash}`);
return new User({
name: req.body.name,
email: req.body.email,
password: hash
});
})
.then(user => {
console.log(`User: ${user}`);
return User.findOne({ email: user.email }).exec();
})
.then(function(err, found_user) {
if (err) {
return next(err);
}
if (found_user) {
console.log("found user");
} else {
user.save(function(err) {
if (err) {
return next(err);
}
res.redirect(user.url);
});
}
})
.catch(err => console.error(err.message));
});
【问题讨论】:
-
"
.then(function(err, found_user) { if (err) { return next(err); }" 完全关闭。一个promise永远不会用两个值来解决,当调用onfulfill回调时不会出错。