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

Node.js(Express.js)接口问题:控制台可打印错误但Postman返回空错误对象

问题分析

你的代码里,错误发生时errorMessage字段用{ err }包裹了错误对象,但Node.js的res.send()在JSON序列化Error对象时,默认仅能识别少数可枚举属性(比如message),而mssql返回的错误对象多数属性不可枚举,导致序列化后变成空对象。控制台能正常打印err,是因为console.log()会自动展开Error对象的所有属性,不受可枚举性限制。

解决办法

直接提取错误的关键属性(如message、code、stack),或者将Error对象转换为普通可序列化对象,避免用{ err }的嵌套写法。同时建议把回调式的request.bulk改成Promise版本,适配你声明的async函数。

修改后的代码

const insertItemDetails = async (body, res) => {
  const table = new sql.Table("table_name");
  table.create = false;
  table.columns.add("jsuordref", sql.VarChar(50), {
    nullable: false,
    primary: true,
  });
  table.columns.add("itemno", sql.Int, {
    nullable: false,
    primary: true,
  });
  table.columns.add("apispec", sql.VarChar(250), { nullable: false });
  table.columns.add("customerspec", sql.VarChar(250), { nullable: false });
  table.columns.add("grade", sql.VarChar(50), { nullable: false });

  let dDate = Date();
  console.log("this is --------------_______>>>" + dDate);
  let smalldate = moment(dDate).format("YYYY-MM-DD");
  let tmstpDate = moment(dDate).format("YYYY-MM-DD HH:mm:ss:SSSS");

  for (let i = 0; i < body.itemDetails.length; i++) {
    table.rows.add(
      body.itemDetails[i].jsuNumber,
      body.itemDetails[i].itemNo,
      body.itemDetails[i].apiSpec,
      body.itemDetails[i].customerSpec,
      body.itemDetails[i].grade
    );
  }

  const request = new sql.Request();
  try {
    const rows = await request.bulk(table);
    const out = {
      code: 200,
      status: "OK",
      message: "JSUOrder successfully created!!",
      jsuOrder: body.jsuNumber,
      response: rows,
    };
    res.send(out);
  } catch (err) {
    console.log(err);
    // 提取错误关键属性,确保可被JSON序列化
    const out = {
      code: 400,
      message: "Something went wrong while uploading Item Details, Please contact IT",
      errorMessage: {
        message: err.message,
        code: err.code,
        stack: err.stack, // 可选,需要错误栈信息则保留
        number: err.number // mssql错误特有的编号属性,按需添加
      }
    };
    res.send(out);
  }
};

额外说明

  • 改用try/catch+await处理异步操作,消除回调嵌套,代码更易维护。
  • 显式提取错误属性能保证序列化后的内容完整,若需要快速转换Error对象,也可以用Object.assign({}, err),但部分隐藏属性可能无法被获取,因此更推荐主动提取关键信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:50:21