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(单结果集)等多个属性,因此会出现重复数据。
你需要根据需求提取正确的结果部分:
- 若只需要单条玩家记录,直接取
recordset[0](查询返回的是数组,即使只有一条数据) - 或者取
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
相关产品推荐
相关产品推荐

