node.js中的Error类

显然在节点文档的控制台核心模块( https://nodejs.org/dist/latest-v4.x/docs/api/console.html )中存在以下代码:

console.error(new Error('Whoops, something bad happened')); // Prints: [Error: Whoops, something bad happened], to stderr 

但是,当我运行test.js代码显示在下面

 var err = new Error('a'); console.error(err); 

terminal打印消息如下:

错误:a在对象。 (module.js:565:10)处的Module._compile(module.js:556:32)处的(/ Users / suoyong / Express /连接数据库/error.js:1:73)在Module.runMain(module.js:590:3)的Function.Module._load(module.js:424:3)上的Module.load(module.js:473:32)上的tryModuleLoad(module.js:432:12) 10)在启动时(bootstrap_node.js:149:9)运行(bootstrap_node.js:394:7)在bootstrap_node.js:509:3

正如你所看到的,我的代码和node doc是一样的,但结果却不一样。 请帮我提一个小问题。

 console.error(new Error('Whoops, something bad happened')); // Prints: [Error: Whoops, something bad happened], to stderr 

这不能从字面上理解。 不pipe在最新的LTS和稳定版本。 打印这样的错误实际上会打印错误对象的文本表示,在文档中被称为[Error: Whoops, something bad happened]Console.error()的文档中进一步阐明了实际的预期行为:

如果在第一个string中找不到格式化元素(例如%d),则在每个参数上调用util.inspect() ,并将结果string值连接起来。

util.inspect() ,这个方法“返回主要用于debugging的对象的string表示”。 对于Errortypes的对象,这将产生一个包含错误消息和堆栈跟踪的string。

 > const txt = util.inspect(new Error("I'm on SO")) undefined > txt 'Error: I\'m on SO\n at repl:1:26\n at sigintHandlersWrap (vm.js:22:35)\n at sigintHandlersWrap (vm.js:96:12)\n at ContextifyScript.Script.runInThisContext (vm.js:21:12)\n at REPLServer.defaultEval (repl.js:313:29)\n at bound (domain.js:280:14)\n at REPLServer.runBound [as eval] (domain.js:293:12)\n at REPLServer.<anonymous> (repl.js:513:10)\n at emitOne (events.js:101:20)\n at REPLServer.emit (events.js:188:7)' > console.log(txt) Error: I'm on SO at repl:1:26 at sigintHandlersWrap (vm.js:22:35) at sigintHandlersWrap (vm.js:96:12) at ContextifyScript.Script.runInThisContext (vm.js:21:12) at REPLServer.defaultEval (repl.js:313:29) at bound (domain.js:280:14) at REPLServer.runBound [as eval] (domain.js:293:12) at REPLServer.<anonymous> (repl.js:513:10) at emitOne (events.js:101:20) at REPLServer.emit (events.js:188:7) 

我猜这是在Node v4和Node v6之间改变的。

使用v4时,输出结果如文件所示; 与v6,输出中包含堆栈跟踪,就像你看到的。

你可以通过使用console.error(err.toString())来解决这个问题,这两个版本都会输出Error: a (所以减去任何括号,但是如果你真的想要那些可以添加它们的话)。