无法将用户数据保存至MongoDB数据库(bcrypt加密后)
问题:使用bcrypt加密密码后无法将用户数据保存至MongoDB
我尝试将用户信息保存至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;
问题分析
你的代码存在两个核心问题:
- 异步操作未等待:
newUser.save()是异步Promise操作,你没有用await,导致user是未兑现的Promise对象,代码会直接返回响应,不会等待数据库完成保存,同时try/catch无法捕获保存过程中的错误。 - 错误捕获不完整:混合使用bcrypt的回调模式和async/await,哈希过程中的错误仅打印日志,没有返回错误响应给客户端,且回调内的错误无法被外层的
try/catch捕获。
修复后的代码
const router = require("express").Router(); const User = require("../models/user"); const bcrypt = require("bcryptjs"); router.post("/register", async (req, res) => { try { // 使用bcrypt的Promise版本配合await,避免回调嵌套 const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(req.body.password, salt); const newUser = new User({ username: req.body.username, email: req.body.email, password: hashedPassword, }); // 等待数据库保存完成 const savedUser = await newUser.save(); // 201状态码更符合资源创建成功的REST规范 res.status(201).json({ status: "user created successfully", message: { user: savedUser } }); } catch (error) { // 400状态码表示客户端请求参数错误,返回具体错误信息 res.status(400).json({ status: "fail", message: error.message || "创建用户失败" }); console.error("创建用户异常:", error); } }); module.exports = router;
关键修复点
- 统一使用
async/await风格,改用bcrypt的Promise版本,消除回调嵌套,让错误捕获更统一。 - 对
newUser.save()添加await,确保数据库保存完成后再返回响应。 - 所有异步操作的错误都通过外层
try/catch捕获,返回合适的HTTP状态码和错误信息给客户端。 - 调整响应状态码:用201表示资源创建成功,400表示客户端请求错误,更符合REST API设计规范。
内容的提问来源于stack exchange,提问作者SCodeyRHODES
相关产品推荐
相关产品推荐

