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

Node.js中如何获取与console.log(error)完全一致的字符串输出

Node.js获取与console.log打印Error完全一致字符串的方案

根本原因

Node.js的console.log输出Error实例时,不会直接读取实例的message、stack属性,也不会调用实例的toString()方法生成内容,而是通过内置util.inspect模块对Error类型做专属格式化处理:

  • 输出开头的错误类名,优先读取错误实例构造函数的name属性(即自定义类的类名),而非实例自身挂载的name属性
  • 堆栈内容排版、空message的展示逻辑均为内部专属实现,和Error实例自带属性的生成逻辑存在差异
    这就是直接读取error.stack、error.toString()得到的内容和控制台打印结果不匹配,手动给实例设置name属性也无法完全对齐输出的核心原因。

具体实现

直接调用Node.js内置util模块的inspect方法即可,console.log内部本身就依赖该方法生成待打印的字符串,返回结果和控制台输出完全一致,且不会向控制台打印任何内容:

import util from 'node:util';

class InvalidParamsError extends Error {
  // 可选配置:如果需要让error.stack、error.toString()也正确显示自定义类名,可添加该构造函数
  constructor(message?: string) {
    super(message);
    this.name = new.target.name;
    // 修复扩展内置Error类的原型链指向问题,保证instanceof判断、constructor属性读取正常
    Object.setPrototypeOf(this, new.target.prototype);
  }
}

try {
  throw new InvalidParamsError();
} catch (error) {
  if (error instanceof Error) {
    // 生成和非TTY环境下console.log(error)完全一致的无颜色字符串
    const errorOutput = util.inspect(error);
    // 如需匹配TTY终端下带ANSI颜色样式的输出,可开启colors配置
    // const coloredErrorOutput = util.inspect(error, { colors: true });
  }
}

补充说明:V8引擎生成Error实例的stack属性字符串是在父类Error构造函数执行阶段完成的,此时自定义类的name属性还未挂载到实例,因此默认情况下error.stack字符串开头的类名会显示为通用Error。如果需要对齐所有场景下的类名显示,只需要在自定义错误类的构造函数中调用super()之后手动设置this.name即可,该操作不会影响util.inspect的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:54:25