使用Postman创建用户遇bcryptjs加密错误,求技术解决方案
问题解决思路
核心问题分析
你遇到的两个错误是连锁反应:
- MongoDB验证错误:
password: Cast to string failed for value "Promise { }"——因为generateHashPassword是异步函数,直接赋值给password时,你存的是一个未resolved的Promise对象,不是哈希后的字符串。 - 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); };
验证修复
- 重启后端服务
- 用Postman重新发送正确的JSON请求,确保
password字段存在 - 此时应该能成功创建用户,数据库中存储的是哈希后的密码字符串
内容的提问来源于stack exchange,提问作者Berk Disli
相关产品推荐
相关产品推荐

