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

Node+Express查询MSSQL返回结果重复显示问题求助

查询MSSQL返回结果重复嵌套的解决方法

在Node.js+Express后端项目中,根据选中的ID值查询MSSQL数据库获取记录时,Postman响应窗口中记录以嵌套格式重复显示两次。

现有代码

const getPlayerById = async(req, res, next) => {
    const id = req.params.id;

    sql.connect(config, function(error) {
        if(error) {
            console.log(err);
        } else {
            var req = new sql.Request();

            var player = req.input('input_parameter', sql.BigInt, id)
                            .query("select distinct * from players WHERE Id=@input_parameter", function(err, recordset) {
                                if(err) {
                                    console.log("Error while querying for Id!: "+err)
                                } else {
                                    return res.send(recordset);
                                }
                            });
        }
    });
}

返回的响应示例

{
    "recordsets": [
        [
            {
                "Id": 3,
                "player_code": "P003",
                "player_name": "Florent Malouda",
                "player_club": "Chelsea",
                "player_position": "Winger"
            }
        ]
    ],
    "recordset": [
        {
            "Id": 3,
            "player_code": "P003",
            "player_name": "Florent Malouda",
            "player_club": "Chelsea",
            "player_position": "Winger"
        }
    ],
    "output": {},
    "rowsAffected": []
}

请求URL:localhost:3200/api/v1/players/3

尝试使用res.recordsets.recordset返回结果时出现错误,以下是正确的处理方式:


解决方案

问题出在你直接返回了mssql库查询后返回的完整recordset对象,这个对象本身包含recordsets(多结果集数组)、recordset(单结果集)等多个属性,因此会出现重复数据。

你需要根据需求提取正确的结果部分:

  1. 若只需要单条玩家记录,直接取recordset[0](查询返回的是数组,即使只有一条数据)
  2. 或者取recordsets[0][0],效果一致

修改后的代码如下:

const getPlayerById = async(req, res, next) => {
    const id = req.params.id;

    sql.connect(config, function(error) {
        if(error) {
            console.log(error); // 修正原代码的变量名错误
            return res.status(500).send({ error: '数据库连接失败' });
        } else {
            var request = new sql.Request(); // 避免和请求对象req重名,改为request

            request.input('input_parameter', sql.BigInt, id)
                    .query("select distinct * from players WHERE Id=@input_parameter", function(err, result) {
                        if(err) {
                            console.log("Error while querying for Id!: "+err);
                            return res.status(500).send({ error: '查询失败' });
                        } else {
                            // 提取单条记录
                            const player = result.recordset[0];
                            return res.send(player);
                        }
                    });
        }
    });
}

补充优化

你的函数声明了async但未使用异步语法,建议改用Promise风格写法,代码更清晰易维护:

const getPlayerById = async(req, res, next) => {
    const id = req.params.id;
    try {
        // 建立数据库连接
        await sql.connect(config);
        // 创建查询请求对象
        const request = new sql.Request();
        request.input('input_parameter', sql.BigInt, id);
        // 执行查询
        const result = await request.query("select distinct * from players WHERE Id=@input_parameter");
        // 返回单条玩家记录
        res.send(result.recordset[0]);
    } catch (err) {
        console.log(err);
        res.status(500).send({ error: '查询出错' });
    } finally {
        // 确保数据库连接关闭
        await sql.close();
    }
}

修改后,Postman会返回干净的单条玩家记录,不会出现重复嵌套的情况。

内容的提问来源于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 11:15:36