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(); });
改动说明:
- 参数数组
data改成一维结构,每个元素对应SQL中的一个?占位符,和字段顺序严格对应 db.query的第二个参数直接传data,不再用[$data]包裹,避免MySQL将参数解析为多行插入的格式- 把
rows改成rows.affectedRows能更准确显示插入的记录数(可选优化)
这样修改后,预编译语句就能正确解析,数据可以正常插入到tickets表中。
内容的提问来源于stack exchange,提问作者Pylot
相关产品推荐
相关产品推荐

