所以我试图将用户详细信息保存到我的MongoDB数据库。在用bcrypt对输入的密码进行散列之前,我成功地保存了数据
我无法保存用户详细信息到数据库后,哈希密码。
这是我的代码
const router = require("express").Router();
const User = require("../models/user");
const bcrypt = require("bcryptjs");
router.post("/register", async (req, res) => {
bcrypt.genSalt(10, function (err, Salt) {
bcrypt.hash(req.body.password, Salt, function (err, hash) {
if (err) {
return console.log("Cannot Encrypt");
}
var hashedPassword = hash;
console.log(hashedPassword);
var newUser = new User({
username: req.body.username,
email: req.body.email,
password: hashedPassword,
});
try {
const user = newUser.save();
res.status(200).json({
status: "user created successfully",
message: {
user: user
}
});
} catch (error) {
res.status(404).json({
status: "fail",
message: error,
});
}
});
});
});
module.exports = router;
下面是 Postman 截图和VSCode终端的截图。
VSCode_terminal
PostmanAPI_screenshot
2条答案
按热度按时间wyyhbhjk1#
问题是由于加密密码时未使用异步/等待,但有一种重要的方法可以在不使用
await
的情况下执行操作,并使用promise
进行错误处理我用
then
和catch
替换了await
关键字,以处理异步函数返回的promise。nkcskrwz2#
这个问题似乎与代码的异步特性有关。
bcrypt.hash
函数是异步的,并在回调函数中返回哈希密码。但是,代码没有正确处理异步行为,在哈希完成之前执行了newUser.save()
行。要解决这个问题,您可以在Promise中对密码进行散列后 Package 代码,并使用
async/await
来正确处理异步行为。下面是代码的更新版本:在这个更新的代码中,等待
bcrypt.genSalt
和bcrypt.hash
函数,以确保在继续之前完成散列。也会等待newUser.save()
行,以确保在发送响应之前将用户保存到数据库。通过使用
async/await
,您可以在正确处理异步操作的同时,以更类似于同步的风格编写代码。