MEAN栈电商项目bcrypt.hashSync报非法参数错误 无法创建用户
bcrypt.hashSync 报 Illegal arguments: undefined, string 错误修复
错误根因
报错是因为传入bcrypt.hashSync()的第一个参数(待加密的密码明文)为undefined,该方法要求第一个入参必须是字符串类型,参数类型不匹配直接触发报错。
排查修复步骤
- 第一步:检查前端提交逻辑是否漏传password字段
你当前前端代码里表单已经正确绑定了password表单控件,问题大概率出在提交时组装用户对象的环节——组装传给后端的User对象时漏写了password字段,导致请求体里没有password值。
提交表单时必须从表单值中取出password字段一并提交,参考正确写法:onSubmit() { this.isSubmitted = true; if (this.userForm.invalid) return; const formVal = this.userForm.value; // 组装提交参数时不要遗漏password const submitData: User = { name: formVal.name, email: formVal.email, password: formVal.password, phone: formVal.phone, isAdmin: formVal.isAdmin, street: formVal.street, apartment: formVal.apartment, zip: formVal.zip, city: formVal.city, country: formVal.country }; this._addUser(submitData); } - 第二步:检查后端是否配置了请求体解析中间件
如果确认前端传了password字段,问题出在后端没有正确解析JSON格式的请求体,导致req.body上取不到对应字段。
检查后端入口文件(通常是app.js/server.js),确保在注册用户路由之前添加了以下中间件:const express = require('express'); const app = express(); // 解析JSON请求体 app.use(express.json()); // 解析x-www-form-urlencoded格式请求体 app.use(express.urlencoded({ extended: true })); // 路由注册必须放在上述中间件之后 const userRoute = require('./routes/users'); app.use('/api/users', userRoute); - 第三步:后端增加必填参数校验(加固逻辑)
不要直接信任前端传参,在加密密码之前先校验必填字段是否存在,避免服务端直接抛出未捕获异常:router.post('/', async (req, res) => { try { // 校验必填参数 if (!req.body.name || !req.body.email || !req.body.password) { return res.status(400).send('name、email、password为必填项,不可为空'); } let user = new User({ name: req.body.name, email: req.body.email, passwordHash: bcrypt.hashSync(req.body.password, 10), phone: req.body.phone, isAdmin: req.body.isAdmin, street: req.body.street, apartment: req.body.apartment, zip: req.body.zip, city: req.body.city, country: req.body.country }); user = await user.save(); if (!user) return res.status(400).send('用户创建失败'); // 注意不要把密码哈希值返回给前端 const returnUser = user.toObject(); delete returnUser.passwordHash; res.send(returnUser); } catch (err) { res.status(500).send(`服务端错误:${err.message}`); } });
内容的提问来源于stack exchange,提问作者Srihari
相关产品推荐
相关产品推荐

