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

如何在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);

代码说明

  1. 先处理空数组的边界情况,避免运行时错误
  2. 基于第一条记录初始化目标结构的poNumber、status、remarks(默认同PO下这三个字段值一致,若业务有特殊规则可调整)
  3. 遍历原始数组,提取每条记录的明细字段并加入items数组
  4. 最终返回的结构可直接通过res.json()返回给客户端,无需额外处理

扩展提示

如果同PO下存在status或remarks不一致的情况,需根据业务规则调整逻辑,比如取最新记录的字段值、合并所有值等。

内容的提问来源于stack exchange,提问作者615

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:54:57