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

使用bcrypt与knex时遇错误:data and salt arguments required

问题

使用bcrypt和knex编写注册接口时遇到data and salt arguments required错误

我正尝试使用bcrypt和knex将请求体中的数据插入到由db变量定义的数据库中,编写的注册接口代码如下:

app.post("/register", (req, res) => {
  const { email, name, password } = req.body;
  const hash = bcrypt.hashSync(password);
  db.transaction((trx) => {
    trx
      .insert({
        hash: hash,
        email: email,
      })
      .into("login")
      .returning("email")
      .then((loginEmail) => {
        return trx("users")
          .returning("*")
          .insert({
            email: loginEmail[0].email,
            name: name,
          })
          .then((user) => {
            res.json(user[0]);
          });
      })
      .then(trx.commit)
      .catch(trx.rollback);
  }).catch((err) => res.status(400).json("unable to register"));
});

目前遇到错误:data and salt arguments required,恳请各位提供帮助。


解决方案

这个错误的核心原因是bcrypt.hashSync()方法需要两个必填参数:待加密的数据(此处为密码)和salt值(或salt生成轮数)。你当前只传入了password一个参数,导致bcrypt触发参数缺失报错。

修复方式(二选一即可)

  1. 手动生成salt后传入
const salt = bcrypt.genSaltSync(10); // 10是推荐的salt轮数,可根据需求调整
const hash = bcrypt.hashSync(password, salt);
  1. 直接传入salt轮数,bcrypt自动生成salt
const hash = bcrypt.hashSync(password, 10); // 第二个参数直接传轮数即可

额外优化建议

  • 先做参数校验:确保请求体中的email、name、password字段都存在且不为空,避免因前端传参遗漏导致password为undefined/null,同样会触发该错误
  • 捕获错误时打印具体信息:方便调试定位问题,而不是只返回通用提示

修改后的完整代码示例:

app.post("/register", (req, res) => {
  const { email, name, password } = req.body;
  
  // 参数校验
  if (!email || !name || !password) {
    return res.status(400).json("请填写完整的注册信息");
  }

  // 生成密码哈希
  const hash = bcrypt.hashSync(password, 10);
  
  db.transaction((trx) => {
    trx
      .insert({
        hash: hash,
        email: email,
      })
      .into("login")
      .returning("email")
      .then((loginEmail) => {
        return trx("users")
          .returning("*")
          .insert({
            email: loginEmail[0].email,
            name: name,
          })
          .then((user) => {
            res.json(user[0]);
          });
      })
      .then(trx.commit)
      .catch(trx.rollback);
  }).catch((err) => {
    console.error("注册错误详情:", err); // 打印错误便于调试
    res.status(400).json("unable to register");
  });
});

内容的提问来源于stack exchange,提问作者Hilary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:51:54