Node.js Express路由GET请求返回ERR_EMPTY_RESPONSE错误求助
嘿,我来帮你梳理下这个问题!先看你贴的代码,首先就发现一个致命的语法错误——最后一行的res.json( response...明显没写完,少了闭合的括号和分号,这会导致代码执行到这里直接抛出语法错误,Express根本没法正常发送响应,自然就返回ERR_EMPTY_RESPONSE了。
接下来咱们一步步解决,顺便补上其他潜在的问题:
1. 先修复未完成的响应代码
把最后一行的res.json( response...改成完整的:
res.json(response);
这是最基础的一步,确保请求能得到响应。
2. 立刻修复SQL注入风险
直接把req.params.ref拼到SQL语句里是非常危险的操作,恶意用户很容易通过构造参数来执行恶意SQL语句。你应该用参数化查询来传递参数,假设你用的是mssql库,修改后的SQL调用应该是这样的:
// 用参数占位符代替直接拼接 execSQLQuery("EXEC SP_PROCESSA_PREMIO @ref", { ref: p1 }, function(result, err) { // 后续逻辑不变 });
如果execSQLQuery是你自己封装的函数,一定要确保它支持参数化查询,避免直接拼接字符串。
3. 完善错误处理逻辑
你的错误判断里用了err != null,其实更稳妥的写法是直接判断if (err)(因为很多库在无错误时err是undefined),同时给错误信息加个兜底,避免err.originalError.info不存在导致的新错误:
if (err) { response = [{ A_STATUS: 0, MSG: err.originalError?.info?.message || '未知错误', FINISHED: new Date(Date.now()) }]; } else { // 给recordset加兜底,避免返回undefined response = result.recordset || []; }
4. 确保回调一定会被触发
要确认你的execSQLQuery函数在所有场景下都会调用回调函数——包括数据库连接失败、SQL执行出错等情况。如果某个分支没调用回调,请求就会一直挂着,最终返回空响应。可以在execSQLQuery里加日志,或者直接在路由里加try-catch捕获同步错误:
router.get('/runpr/:ref', function(req, res, next) { try { var p1 = req.params.ref; execSQLQuery("EXEC SP_PROCESSA_PREMIO @ref", { ref: p1 }, function(result, err) { var response = []; if (err) { response = [{ A_STATUS: 0, MSG: err.originalError?.info?.message || '未知错误', FINISHED: new Date(Date.now()) }]; } else { response = result.recordset || []; } res.json(response); }); } catch (err) { // 把同步错误传给Express的全局错误处理中间件 next(err); } });
同时给你的Express app加上全局错误处理中间件,避免未捕获的错误导致请求无响应:
app.use(function(err, req, res, next) { console.error('服务器错误:', err.stack); res.status(500).json({ A_STATUS: 0, MSG: '服务器内部错误', FINISHED: new Date(Date.now()) }); });
5. 调试小技巧
- 在
execSQLQuery的回调里加console.log(err, result),看看是否有错误信息或者数据返回,确认代码执行到了哪一步。 - 用Postman或curl发起请求,同时查看Node.js控制台的日志,定位问题所在。
内容的提问来源于stack exchange,提问作者Paulo Henrique

