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

