如何在 javascript 中正确记录错误对象

Nis*_*ave 3 javascript mongoose express

我对网络开发相当陌生,并没有过多考虑错误。但今天我注意到我必须使用一些东西json.stringyfy()来查看整个错误对象。另外,message语句 2 中未显示密钥,但当我打印时,error.message我收到一条消息而不是undefined. “message”甚至不是一个键(检查语句4),但仍然记录错误。message 记录一个值(typeof(error.message)is string)。

 try {
           //Some error occours
    } catch (error) {
        console.log(JSON.stringify(error)) //statement 1
        console.error(error) //statement 2
        console.log(error.message) //statement 3
        console.log(Object.keys(error)) //statement 4
    }
Run Code Online (Sandbox Code Playgroud)

语句1日志

MongoServerError: E11000 duplicate key error collection: trendyApp.Markets index: name_1 dup key: { name: "murat market" }
    at D:\web projects\trendyApp\server\node_modules\mongodb\lib\operations\insert.js:51:33
    at D:\web projects\trendyApp\server\node_modules\mongodb\lib\cmap\connection_pool.js:273:25
    at handleOperationResult (D:\web projects\trendyApp\server\node_modules\mongodb\lib\sdam\server.js:363:9)
    at MessageStream.messageHandler (D:\web projects\trendyApp\server\node_modules\mongodb\lib\cmap\connection.js:474:9)
    at MessageStream.emit (events.js:375:28)
    at processIncomingData (D:\web projects\trendyApp\server\node_modules\mongodb\lib\cmap\message_stream.js:108:16)
    at MessageStream._write (D:\web projects\trendyApp\server\node_modules\mongodb\lib\cmap\message_stream.js:28:9)
    at writeOrBuffer (internal/streams/writable.js:358:12)
    at MessageStream.Writable.write (internal/streams/writable.js:303:10)
    at TLSSocket.ondata (internal/streams/readable.js:726:22) {
  index: 0,
  code: 11000,
  keyPattern: { name: 1 },
  keyValue: { name: 'murat market' }
}
Run Code Online (Sandbox Code Playgroud)

语句2日志

{"index":0,"code":11000,"keyPattern":{"name":1},"keyValue":{"name":"murat market"}}
Run Code Online (Sandbox Code Playgroud)

语句3日志

E11000 duplicate key error collection: trendyApp.Markets index: name_1 dup key: { name: "murat market" }
Run Code Online (Sandbox Code Playgroud)

我在制作快速应用程序时看到了这种行为,错误是由 mongoose 生成的,但我认为这在整个 javascript 中很常见

语句4日志

[ 'index', 'code', 'keyPattern', 'keyValue' ]
Run Code Online (Sandbox Code Playgroud)

tri*_*cot 5

“消息”甚至不是密钥(检查语句 4)

它是,但Object.keys旨在列出可枚举属性,并且message不可枚举。

在 ECMAScript 规范中,我们在Error 构造函数的部分中看到构造函数使用以下过程创建其消息(和其他属性):

执行CreateNonEnumerableDataPropertyOrThrow ( O , "message", msg )。

当然,可以通过 JavaScript 代码将其他自定义属性添加到 Error 对象,这解释了为什么其他属性通过Object.keys().

至于输出console.logconsoleAPI 实现在如何显示对象方面有很大的自由度——在实现之间可以发现很多差异。

要同时输出那些不可枚举的属性,请使用

console.log(Object.getOwnPropertyNames(error))
Run Code Online (Sandbox Code Playgroud)