我正在使用mongodb和node创建用户创建页面。获取名称,电子邮件和密码后,我尝试对密码进行哈希处理,然后将其保存到mongodb中。我可以通过使用异步和等待来遵循最佳实践。但是我想更多地了解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));
});
答案 0 :(得分:1)
您为什么需要通过new User
?它不是猫鼬中的异步操作。它只是创建模型的新实例。您可以将代码重构为较短的代码,例如:
router.post("/", (req, res, next) =>
User.findOne({ email: user.email }).exec().then(user => {
if(user) {
console.log("found user")
next()
} else {
return bcrypt
.genSalt(10)
.then(salt => bcrypt.hash(req.body.password, salt))
.then(hash => {
var user = new User({
name: req.body.name,
email: req.body.email,
password: hash
});
return user.save().exec()
}).then(user => {
// user is saved do whats next
next()
})
}
}).catch(err => console.error(err.message));
)