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

ExpressJS/NodeJS中抛出错误后如何获取错误信息?

问题解决方法

核心原因

Error构造函数仅接受字符串作为参数,你直接传入对象时,它会自动调用对象的toString()方法,结果就是[object Object],且自定义的statusCode和message属性不会被挂载到错误实例上,导致后续无法获取这些信息。

解决方案

方案一:自定义错误类(推荐)

创建继承自Error的自定义类,统一管理错误格式:

class CustomError extends Error {
  constructor(statusCode, message) {
    super(message);
    this.statusCode = statusCode;
    // 维护原型链,保证instanceof判断正常
    Object.setPrototypeOf(this, CustomError.prototype);
  }
}

// 使用自定义错误类
app.use((req, res, next) => {
  throw new CustomError(404, 'Not Found');
});

app.use((err, req, res, next) => {
  console.log(`状态码:${err.statusCode},消息:${err.message}`);
  // 直接打印错误对象也能显示完整信息
  console.log(err);
  // 转为JSON输出指定属性
  console.log(JSON.stringify(err, ['statusCode', 'message', 'stack']));
});

方案二:手动给Error实例添加属性

如果不想自定义类,可在创建Error实例后挂载自定义属性:

app.use((req, res, next) => {
  const err = new Error('Not Found');
  err.statusCode = 404;
  throw err;
});

app.use((err, req, res, next) => {
  console.log({ statusCode: err.statusCode, message: err.message });
  console.log(JSON.stringify(err));
});

额外提示

若一定要传递对象作为错误信息,可通过Error.captureStackTrace构建错误对象,但这种方式的错误不是标准Error实例,可能影响部分错误处理逻辑,谨慎使用:

app.use((req, res, next) => {
  const err = { statusCode: 404, message: 'Not Found' };
  Error.captureStackTrace(err, arguments.callee);
  throw err;
});

app.use((err, req, res, next) => {
  console.log(err.statusCode, err.message);
  console.log(JSON.stringify(err));
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:10:37