如何在Node.js+Express+MSSQL环境下自定义查询结果的JSON响应结构
数据结构转换实现方案
问题场景
使用Node.js + Express.js + MSSQL 2000(搭配node-mssql)开发时,从数据库查询得到的是包含同PO下多条商品记录的数组,需要将其转换为客户端要求的分层结构:头部存poNumber,主体items数组存商品明细,尾部存status和remarks。
原始查询结果
[ { "poNumber": "002", "modelCode": "SM-A536EZWHXID", "orderQuantity": "1", "invoiceQuantity": null, "price": "1000", "totalPrice": "1000", "receivedDate": "Mar 26 2023 3:26AM", "status": null, "remarks": null }, { "poNumber": "002", "modelCode": "SM-A536EZWHXID", "orderQuantity": "1", "invoiceQuantity": null, "price": "1000", "totalPrice": "1000", "receivedDate": "Mar 26 2023 3:26AM", "status": null, "remarks": null }, { "poNumber": "002", "modelCode": "SM-A536EZOGXID", "orderQuantity": "1", "invoiceQuantity": null, "price": "1000", "totalPrice": "1000", "receivedDate": "Mar 26 2023 3:26AM", "status": null, "remarks": null } ]
客户端要求的目标格式
{ "poNumber": "002", "items": [ { "modelCode": "SM-A536EZWHXID", "orderQuantity": "1", "invoiceQuantity": null, "price": "1000", "totalPrice": "1000", "receivedDate": "Mar 26 2023 3:26AM" }, { "modelCode": "SM-A536EZWHXID", "orderQuantity": "1", "invoiceQuantity": null, "price": "1000", "totalPrice": "1000", "receivedDate": "Mar 26 2023 3:26AM" }, { "modelCode": "SM-A536EZOGXID", "orderQuantity": "1", "invoiceQuantity": null, "price": "1000", "totalPrice": "1000", "receivedDate": "Mar 26 2023 3:26AM" } ], "status": null, "remarks": null }
实现代码
用数组reduce方法完成聚合转换,逻辑简洁高效:
// 假设dbResult是从数据库查询得到的原始数组 const transformPoData = (dbResult) => { // 处理空结果的边界情况 if (!dbResult || dbResult.length === 0) { return {}; } // 基于第一条记录初始化目标结构的固定字段 const result = { poNumber: dbResult[0].poNumber, items: [], status: dbResult[0].status, remarks: dbResult[0].remarks }; // 遍历提取明细字段,填充items数组 dbResult.forEach(item => { result.items.push({ modelCode: item.modelCode, orderQuantity: item.orderQuantity, invoiceQuantity: item.invoiceQuantity, price: item.price, totalPrice: item.totalPrice, receivedDate: item.receivedDate }); }); return result; }; // 使用示例 const dbResult = [/* 原始查询结果数组 */]; const formattedData = transformPoData(dbResult); // 转换为JSON返回给客户端 res.json(formattedData);
代码说明
- 先处理空数组的边界情况,避免运行时错误
- 基于第一条记录初始化目标结构的
poNumber、status、remarks(默认同PO下这三个字段值一致,若业务有特殊规则可调整) - 遍历原始数组,提取每条记录的明细字段并加入
items数组 - 最终返回的结构可直接通过
res.json()返回给客户端,无需额外处理
扩展提示
如果同PO下存在status或remarks不一致的情况,需根据业务规则调整逻辑,比如取最新记录的字段值、合并所有值等。
内容的提问来源于stack exchange,提问作者615
相关产品推荐
相关产品推荐

