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

NodeJS中MySQL预编译插入语句报错,求助排查解决

NodeJS中MySQL预编译插入语句ER_PARSE_ERROR错误修复

你的代码出现ER_PARSE_ERROR的核心原因是参数数组嵌套层级错误,导致MySQL解析SQL时生成了非法的语法结构。从报错信息里的SQL语句能看到,VALUES部分被错误拆成了多个括号组,还残留了多余的占位符。

具体修改点:

  • 不需要将每个字段值单独放在子数组里,直接用一维数组存储所有参数
  • 调用db.query时,直接传递参数数组,不要在外层再套一层数组
  • 变量名避免用$开头(JS中无语法问题,但不符合常规编码习惯)

修改后的/repair接口代码:

app.post('/repair', (req, res, next) => {
    const query = "INSERT INTO tickets (firstName, lastName, email, phone, description) VALUES (?, ?, ?, ?, ?)";
    const data = [
        req.body.firstName, 
        req.body.lastName,
        req.body.email, 
        req.body.phone, 
        req.body.request
    ];
    db.query(query, data, (err, rows, fields) => {
        if (!err) { 
            console.log('Repair was succesfully sent to the servers database! \n Records: ' + rows.affectedRows);
        } else {
            console.log(err);
        }
    });
    console.log(req.body.firstName, req.body.lastName, req.body.email, req.body.phone, req.body.request);
    res.send("<h1>FORM SENT</h1>");
    next();
});

改动说明:

  1. 参数数组data改成一维结构,每个元素对应SQL中的一个?占位符,和字段顺序严格对应
  2. db.query的第二个参数直接传data,不再用[$data]包裹,避免MySQL将参数解析为多行插入的格式
  3. 把rows改成rows.affectedRows能更准确显示插入的记录数(可选优化)

这样修改后,预编译语句就能正确解析,数据可以正常插入到tickets表中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:35:26