如何在 javascript 中正确记录错误对象
How to properly log error object in javascript
我是网络开发的新手,并没有过多考虑错误。但是今天我注意到我必须使用 json.stringyfy()
来查看整个错误对象。 message
键也没有在语句 2 中显示,但是当我打印 error.message
时,我收到一条消息而不是 undefined
。
“消息”甚至不是键(检查语句 4)但仍在记录 error.message 记录一个值(typeof(error.message)
是 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
}
语句 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' }
}
语句 2 日志
{"index":0,"code":11000,"keyPattern":{"name":1},"keyValue":{"name":"murat market"}}
语句 3 日志
E11000 duplicate key error collection: trendyApp.Markets index: name_1 dup key: { name: "murat market" }
我在制作快速应用程序时看到了这种行为,错误是由 mongoose 生成的,但我认为这在整个 javascript
中很常见
语句 4 日志
[ 'index', 'code', 'keyPattern', 'keyValue' ]
"message" is not even a key(check statement 4)
是,但是Object.keys
是为了列出enumerable属性,message
是不可枚举的。
在 ECMAScript 规范中,我们在 the Error constructor 部分看到构造函数使用以下过程创建其消息(和其他属性):
Perform CreateNonEnumerableDataPropertyOrThrow(O, "message", msg).
其他 -- 自定义 -- 属性当然可以通过 JavaScript 代码添加到 Error 对象,这解释了为什么其他属性 被 列在 Object.keys()
.
至于 console.log
的输出:console
API 实现在如何显示对象方面有很大的自由度——实现之间存在很多差异。
要同时输出那些 non-enumerable 属性,请使用
console.log(Object.getOwnPropertyNames(error))
正如@trincot 所说,它没有显示,因为 message
是 Error 构造函数的不可枚举属性, MongoServerError is overriding the MongoError 实际上这是覆盖 JS Error 对象,所以如果你需要要知道错误中包含哪些属性,您可以查看之前的链接以查看可以检查哪些属性。
此外,如果您想获取所有属性(包括不可枚举的属性),您可以使用 Object.getOwnProperties(error)
查看给定对象具有的所有属性。
您还可以使用 Object.getOwnPropertyDescriptors(error) 了解您在给定对象中定义的每个属性的描述符。
遗憾的是错误堆栈和消息字段不可枚举,下面是一个实用函数,它从错误对象中提取所有属性,甚至是您分配给错误的自定义字段:
const err = new Error('Something bad happened.');
err.metadata = { custom: { field: '1' } };
console.log(errorToPOJO(err)); // {"stack":"Error: Something bad happened.\n at <anonymous>:1:13","message":"Something bad happened.","metadata":{"custom":{"field":"1"}}
function errorToPOJO(error) {
const ret = {};
for (const properyName of Object.getOwnPropertyNames(error)) {
ret[properyName] = error[properyName];
}
return ret;
};
如果您使用 api
,请试试这个
console.log(error.message.toString())
我是网络开发的新手,并没有过多考虑错误。但是今天我注意到我必须使用 json.stringyfy()
来查看整个错误对象。 message
键也没有在语句 2 中显示,但是当我打印 error.message
时,我收到一条消息而不是 undefined
。
“消息”甚至不是键(检查语句 4)但仍在记录 error.message 记录一个值(typeof(error.message)
是 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
}
语句 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' }
}
语句 2 日志
{"index":0,"code":11000,"keyPattern":{"name":1},"keyValue":{"name":"murat market"}}
语句 3 日志
E11000 duplicate key error collection: trendyApp.Markets index: name_1 dup key: { name: "murat market" }
我在制作快速应用程序时看到了这种行为,错误是由 mongoose 生成的,但我认为这在整个 javascript
中很常见语句 4 日志
[ 'index', 'code', 'keyPattern', 'keyValue' ]
"message" is not even a key(check statement 4)
是,但是Object.keys
是为了列出enumerable属性,message
是不可枚举的。
在 ECMAScript 规范中,我们在 the Error constructor 部分看到构造函数使用以下过程创建其消息(和其他属性):
Perform CreateNonEnumerableDataPropertyOrThrow(O, "message", msg).
其他 -- 自定义 -- 属性当然可以通过 JavaScript 代码添加到 Error 对象,这解释了为什么其他属性 被 列在 Object.keys()
.
至于 console.log
的输出:console
API 实现在如何显示对象方面有很大的自由度——实现之间存在很多差异。
要同时输出那些 non-enumerable 属性,请使用
console.log(Object.getOwnPropertyNames(error))
正如@trincot 所说,它没有显示,因为 message
是 Error 构造函数的不可枚举属性, MongoServerError is overriding the MongoError 实际上这是覆盖 JS Error 对象,所以如果你需要要知道错误中包含哪些属性,您可以查看之前的链接以查看可以检查哪些属性。
此外,如果您想获取所有属性(包括不可枚举的属性),您可以使用 Object.getOwnProperties(error)
查看给定对象具有的所有属性。
您还可以使用 Object.getOwnPropertyDescriptors(error) 了解您在给定对象中定义的每个属性的描述符。
遗憾的是错误堆栈和消息字段不可枚举,下面是一个实用函数,它从错误对象中提取所有属性,甚至是您分配给错误的自定义字段:
const err = new Error('Something bad happened.');
err.metadata = { custom: { field: '1' } };
console.log(errorToPOJO(err)); // {"stack":"Error: Something bad happened.\n at <anonymous>:1:13","message":"Something bad happened.","metadata":{"custom":{"field":"1"}}
function errorToPOJO(error) {
const ret = {};
for (const properyName of Object.getOwnPropertyNames(error)) {
ret[properyName] = error[properyName];
}
return ret;
};
如果您使用 api
,请试试这个console.log(error.message.toString())