使用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触发参数缺失报错。
修复方式(二选一即可)
- 手动生成salt后传入
const salt = bcrypt.genSaltSync(10); // 10是推荐的salt轮数,可根据需求调整 const hash = bcrypt.hashSync(password, salt);
- 直接传入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
相关产品推荐
相关产品推荐

