You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将用户数据保存至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;

问题分析

你的代码存在两个核心问题:

  1. 异步操作未等待:newUser.save()是异步Promise操作,你没有用await,导致user是未兑现的Promise对象,代码会直接返回响应,不会等待数据库完成保存,同时try/catch无法捕获保存过程中的错误。
  2. 错误捕获不完整:混合使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:25:28