Node.js+Express中ERR_HTTP_HEADERS_SENT错误及MSSQL查询结果重复问题
MSSQL查询球员数据的两个问题解决
1. Error [ERR_HTTP_HEADERS_SENT] 错误原因及修复
错误原因
代码存在重复发送HTTP响应的问题:
sql.connect是异步操作,回调里的res.send(recordset)会在数据库查询完成后执行- 但不管回调逻辑如何,
sql.connect代码块结束后都会执行return res.send("Record fetched for selected player!") - 服务器试图向客户端发送两次响应头,触发
Cannot set headers after they are sent to the client错误
此外,错误处理不完整:数据库连接或查询出错时仅打印日志,未向客户端返回错误响应。
修复代码
改用async/await替代回调(充分利用已声明的async函数),确保只发送一次响应:
const getPlayerById = async (req, res, next) => { try { const id = req.params.id; // 建立数据库连接 await sql.connect(config); // 创建请求对象 const request = new sql.Request(); // 执行查询并获取结果 const result = await request .input('input_parameter', sql.BigInt, id) .query("select distinct * from players WHERE Id=@input_parameter"); // 返回查询到的球员数据 res.send(result.recordset); } catch (error) { // 统一返回错误信息 res.status(400).send(`查询失败:${error.message}`); } finally { // 确保数据库连接关闭 await sql.close(); } }
2. 查询结果嵌套重复返回的问题解决
问题原因
mssql库的query方法返回的结果对象默认包含多个元数据属性:
recordsets: 所有结果集的二维数组recordset: 第一个结果集的一维数组(直接包含球员对象)output、rowsAffected: 其他查询元数据
直接返回整个结果对象会把这些属性全部返回,导致数据重复嵌套。
修复方法
只返回result.recordset(或result.recordsets[0],两者效果一致),仅保留球员数据:
修改后返回结果示例:
[ { "Id": 6, "player_code": "P006", "player_name": "Petr Cech", "player_club": "Chelsea", "player_position": "Goalkeeper" } ]
如果期望返回单个球员对象(按Id查询结果唯一),可进一步处理:
res.send(result.recordset[0] || {});
内容的提问来源于stack exchange,提问作者Prabir Choudhury
相关产品推荐
相关产品推荐

