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

使用Postman创建用户遇bcryptjs加密错误,求技术解决方案

问题解决思路

核心问题分析

你遇到的两个错误是连锁反应:

  1. MongoDB验证错误:password: Cast to string failed for value "Promise { }"——因为generateHashPassword是异步函数,直接赋值给password时,你存的是一个未resolved的Promise对象,不是哈希后的字符串。
  2. bcrypt参数错误:Illegal arguments: undefined, number——说明传入bcrypt.hash的明文密码是undefined,大概率是req.body.password没有正确获取到。

分步修复

1. 修复异步函数调用问题

在addUser里创建用户前,必须用await等待密码哈希完成,不能直接把Promise赋值给password:

const addUser = async (req, res) => {
    try {
        const isExist = await User.findOne({ email: req.body.email });
        if (isExist)
            return res.status(400).json({
                message: `the user already exist`
            });

        // 先等待密码哈希完成,再创建用户
        const hashedPassword = await generateHashPassword(req.body.password);
        const newUser = new User({
            id: getUniqueId(),
            name: req.body.name,
            email: req.body.email,
            age: req.body.age,
            password: hashedPassword // 这里用哈希后的字符串
        });

        const user = await newUser.save();
        if (!user)
            return res.status(400).json({
                message: "user was not created"
            });

        return res.status(201).json({
            message: "user was created"
        });
    } catch (err) {
        return res.status(500).json({
            message: err.message
        });
    }
};

2. 解决req.body.password为undefined的问题

  • 检查后端是否配置了解析JSON请求体的中间件(比如Express的express.json()),如果没加,在你的主入口文件里加上:
    const express = require('express');
    const app = express();
    
    // 必须加这个中间件才能解析Postman发送的JSON格式请求体
    app.use(express.json());
    
  • 检查Postman的请求:确保是POST请求,Body选择raw->JSON,并且正确传入password字段,比如:
    {
        "name": "test",
        "email": "test@example.com",
        "age": 20,
        "password": "yourpassword"
    }
    

3. 修正错误的Promise封装写法

你后来尝试的Promise版本完全没必要,而且逻辑错误(哈希后的密码和明文密码不可能相等,应该直接返回哈希值)。generateHashPassword保持最初的简洁写法即可:

const generateHashPassword = async (plainPassword) => {
    const saltRounds = 10;
    // async函数会自动包装Promise结果,无需额外await
    return bcrypt.hash(plainPassword, saltRounds);
};

验证修复

  1. 重启后端服务
  2. 用Postman重新发送正确的JSON请求,确保password字段存在
  3. 此时应该能成功创建用户,数据库中存储的是哈希后的密码字符串

内容的提问来源于stack exchange,提问作者Berk Disli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:15:09