You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:40:58