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表示”。 对于Error
types的对象,这将产生一个包含错误消息和堆栈跟踪的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
(所以减去任何括号,但是如果你真的想要那些可以添加它们的话)。