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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:25:03