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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:15:02