Node.js调用MySQL存储过程失败,报ER_PARSE_ERROR(1064)语法错误
解决Node.js调用MySQL存储过程的ER_PARSE_ERROR语法错误
嘿,我一眼就定位到你遇到的语法错误根源了:在MySQL中调用存储过程必须使用CALL关键字,你直接写存储过程名称会被当作普通SQL语句解析,自然触发ER_PARSE_ERROR错误。
问题代码的核心错误
你当前的调用方式:
connection.query('sp_LI_UploadData_Get', function (err, results, fields) { ... })
MySQL无法识别这是一个存储过程调用,会把它当成无效的SQL语句处理,这就是报错的直接原因。
修正后的完整代码示例
把SQL语句改成CALL sp_LI_UploadData_Get()(如果存储过程需要参数,就在括号里传入参数占位符并配合参数数组),同时完善错误处理逻辑(避免重复发送响应):
app.get('/pool', function (req, res) { pool.getConnection(function (err, connection) { if (err) { console.log("获取数据库连接失败:", err); return res.status(500).send("数据库连接失败"); } console.log("成功获取数据库连接"); // 关键修正:使用CALL关键字调用存储过程 connection.query('CALL sp_LI_UploadData_Get()', function (err, results, fields) { // 无论成功失败,都要释放连接,避免连接池耗尽 connection.release(); if (err) { console.log("执行存储过程出错:", err); return res.status(400).send(err); } res.send(JSON.stringify(results)); }); }); });
额外注意事项
- 如果你的存储过程需要传入参数,要使用参数占位符并传入参数数组,比如:
// 假设存储过程需要两个参数:id和name connection.query('CALL sp_LI_UploadData_Get(?, ?)', [123, "test_data"], function (err, results) { // 处理逻辑 }); - 建议用
try/catch/finally结构(或async/await语法)管理连接释放,确保即使发生错误也能归还连接:// 用async/await优化后的写法示例 app.get('/pool', async function (req, res) { let connection; try { connection = await pool.getConnection(); const [results] = await connection.query('CALL sp_LI_UploadData_Get()'); res.send(JSON.stringify(results)); } catch (err) { console.log("出错:", err); res.status(err.code === 'ER_PARSE_ERROR' ? 400 : 500).send(err); } finally { if (connection) connection.release(); } }); - 确认你的MySQL用户拥有执行该存储过程的权限,且存储过程确实存在于目标数据库中。
内容的提问来源于stack exchange,提问作者ganesan s
相关产品推荐
相关产品推荐

