Node.js+Express TodoList POST请求MySQL语法错误排查求助
解决POST接口的SQL语法错误问题
你的报错ER_PARSE_ERROR核心原因有两个,逐个解决:
1. 缺少JSON请求体解析中间件
Express默认不会自动解析JSON格式的请求体,导致req.body为undefined。当这个undefined传入Model的create方法后,结合你execQuery里默认的params = '',最终生成的SQL会变成:
INSERT INTO todolist.tasks SET ''
这显然不符合SQL语法,触发报错。
解决方法:在你的Express主入口文件(比如app.js/index.js)中添加JSON解析中间件:
const express = require('express'); const app = express(); // 解析JSON格式的请求体,必须放在路由挂载之前 app.use(express.json()); // 挂载你的任务路由 const taskRouter = require('./routes/your-router-path'); app.use(taskRouter);
2. 修正execQuery的默认参数错误
你在execQuery方法里把params的默认值设为''(空字符串),当传入的参数无效时,会直接拼入SQL导致语法错误。应该将默认值改为undefined或者空对象,让MySQL驱动自行处理空参数的情况。
修改Model中的execQuery方法:
execQuery(sql, params) { return new Promise((resolve, reject) => { // 若params为空,传入空对象避免语法错误 connection.query(sql, params || {}, (error, response) => { if (error) { return reject(error); } return resolve(response); }); }); }
额外的参数校验(可选但推荐)
在Controller的create方法中增加请求体校验,提前拦截无效请求:
create(req, response) { const newTask = req.body; // 校验请求体是否为空 if (!newTask || Object.keys(newTask).length === 0) { return response.status(400).json('请提供有效的任务数据'); } const task = taskModel.create(newTask); return task .then((createdTask) => response.status(201).json(createdTask)) .catch((error) => response.status(400).json(error.message)); }
为什么GET接口正常?因为GET请求不需要解析请求体,直接执行查询SQL即可,不受上述问题影响。
内容的提问来源于stack exchange,提问作者math_silveira
相关产品推荐
相关产品推荐

