MySQL两张表传递user_id及Node.js数据库INSERT查询报错如何解决
问题根因
你遇到的报错是因为connection.query的传参格式不符合Node.js mysql驱动的调用规范:你混用了两种INSERT语法的传参方式,导致参数顺序错位,回调函数被放到了非预期的参数位置,方法识别不到合法的回调参数才抛出该类型错误。
你原来的写法同时传入了占位符SQL、独立的user_id对象、字段值数组三个参数,不符合mysql驱动的query方法签名要求:
- 当使用
INSERT INTO 表 SET ?语法时,第二个参数直接接收包含所有待插入字段的键值对对象 - 当使用
?作为值占位符的SQL语法时,第二个参数接收和占位符数量对应的参数数组
两种写法不能混用,否则会导致参数计数错误。
修复方案
方案1:使用对象传参(更简洁,推荐)
直接把所有待插入的字段放到同一个对象中,适配SET ?语法:
exports.create = async (req, res, next) => { if (req.cookies.jwt) { try { //1)verify the token var decoded = await promisify(jwt.verify)(req.cookies.jwt, process.env.JWT_SECRET ); const { first_name, last_name } = req.body; connection.query('INSERT INTO user SET ?', { user_id: decoded.id, first_name, last_name }, (err, rows) => { if (!err) { res.render('add-crew', { alert: 'Crew member added succesfully!' }); } else { console.log(err); } console.log('The data from user table:\n', rows); }); } catch (error) { console.log(error); return next(); } } };
方案2:使用占位符数组传参
如果习惯使用占位符写法,调整占位符数量和参数数组的顺序即可:
connection.query('INSERT INTO user SET first_name = ?, last_name = ?, user_id = ?', [first_name, last_name, decoded.id], (err, rows) => { // 原有回调逻辑保持不变 })
注意事项
如果你的user表的user_id字段是自增主键,请先确认表结构是否允许手动插入该字段的值;如果是关联login表的普通外键字段,上述两种方案都可以正常完成字段值的同步。
内容的提问来源于stack exchange,提问作者Cesare Mannino
相关产品推荐
相关产品推荐

