使用hashSync实现注册密码加密时遇'data and salt required'错误求助
解决bcrypt.hashSync报错'data and salt are required'的问题
错误根源是你调用bcrypt.hashSync时只传了明文密码,缺少第二个必填参数(盐值或盐生成轮数)。bcrypt要求必须同时提供要哈希的明文数据(这里就是用户密码)和盐相关参数,才能完成哈希计算。
两种修复方案:
方案1:手动生成盐再哈希
先调用genSaltSync生成盐,再把盐和密码一起传入hashSync:
const userRouter = express.Router(); userRouter.post('/signup',expressAsyncHandler(async (req, res) => { // 生成盐,10是加密轮数,可根据需求调整(建议10-12) const salt = bcrypt.genSaltSync(10); // 修正代码里的拼写错误:newUSer → newUser const newUser = new User({ name: req.body.name, email: req.body.email, password: bcrypt.hashSync(req.body.password, salt) }); const user = await newUser.save(); res.send({ _id: user._id, name: user.name, email: user.email, isAdmin: user.isAdmin, token: generateToken(user), }); }) );
方案2:直接传入轮数,让bcrypt自动生成盐
这是更简洁的写法,直接把轮数作为第二个参数传入,bcrypt会自动生成对应复杂度的盐:
const userRouter = express.Router(); userRouter.post('/signup',expressAsyncHandler(async (req, res) => { const newUser = new User({ name: req.body.name, email: req.body.email, // 第二个参数传10,代表生成盐的轮数 password: bcrypt.hashSync(req.body.password, 10) }); const user = await newUser.save(); res.send({ _id: user._id, name: user.name, email: user.email, isAdmin: user.isAdmin, token: generateToken(user), }); }) );
额外注意事项:
- 要确保前端请求的
req.body中确实包含password字段,如果密码为空或未传递,依然会触发类似的"data is required"错误 - 加密轮数建议设置在10-12之间,过高会大幅增加哈希计算时间,影响接口响应速度;过低则会降低密码安全性
内容的提问来源于stack exchange,提问作者laroussi torki
相关产品推荐
相关产品推荐

