NodeJS用Sequelize+Postgres创建用户时出现Bcrypt参数缺失错误如何解决
错误原因排查与解决方案
核心报错原因
你遇到的Error: data and salt arguments required报错,本质是调用bcrypt.hash()方法时,第一个待加密的参数为空值。你已经传了第二个salt轮数参数10,所以问题出在密码参数缺失上。
具体可能的触发场景及修复方案:
场景1:请求体参数缺失/解析失败
你在控制器中直接解构req.body.password,没有提前做非空校验:- 若前端请求没有携带
password字段,或者字段名拼写错误(比如写为pwd、pass等不匹配的命名),会导致password变量为undefined - 若请求头没有设置
Content-Type: application/json,express默认不会解析json格式的请求体,会导致整个req.body为空,所有字段均为undefined
修复方案:在调用bcrypt之前加参数校验
// 放在解构req.body之后、bcrypt.hash之前 if (!password || typeof password !== 'string') { return res.status(400).json({ status: 'error', message: '密码不能为空且必须为字符串格式' }) }- 若前端请求没有携带
场景2:代码写法不规范导致异常未捕获
你当前的代码混合了async/await和.then().catch()写法,逻辑层级混乱容易漏捕获异常,建议统一用try/catch包裹异步逻辑:const { User } = require('../../models/user'); const bcrypt = require('bcrypt'); module.exports = async (req, res) => { try { const { full_name, email, username, password, age, phone_number } = req.body; // 提前做参数非空校验 if (!password) { return res.status(400).json({status: 'error', message: '密码不能为空'}) } const hash = await bcrypt.hash(password, 10); const createResult = await User.create({ full_name, email, username, password: hash, age, phone_number }) return res.status(201).json({ status: 'success', message: 'Success register', data: createResult }) } catch (error) { return res.status(400).json({ status: 'error', message: error.message }); } }
额外隐藏问题修复
你当前的User模型中profile_image_url字段设置了allowNull: true且配置了默认值,但同时加了notEmpty校验,Sequelize会在触发默认值赋值之前先走校验规则,如果你创建用户时没有传这个字段,notEmpty会判定空值不符合要求抛出异常,建议移除该字段的notEmpty校验,或者把allowNull改成false保持逻辑一致。
内容的提问来源于stack exchange,提问作者M. Hafidurrohman
相关产品推荐
相关产品推荐

