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
相关产品推荐
相关产品推荐

