Soy bastante nuevo en el desarrollo web y no he pensado mucho en el error. Pero hoy noté algo, tengo que usar json.stringyfy() para ver el objeto de error completo. Además, la clave del message no se muestra en la declaración 2, pero cuando error.message recibo un mensaje en lugar de undefined . "mensaje" ni siquiera es una clave (compruebe la declaración 4) pero aún registra el error. El mensaje registra un valor ( typeof(error.message) es 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 }declaración 1 registros
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' } }declaración 2 registros
{"index":0,"code":11000,"keyPattern":{"name":1},"keyValue":{"name":"murat market"}}declaración 3 registros
E11000 duplicate key error collection: trendyApp.Markets index: name_1 dup key: { name: "murat market" }Vi este comportamiento mientras estaba haciendo una aplicación express y el error lo genera mangosta, pero creo que esto sería común en todo javascript
declaración 4 registros
[ 'index', 'code', 'keyPattern', 'keyValue' ]"mensaje" ni siquiera es una clave (compruebe la declaración 4)
Lo es, pero Object.keys está diseñado para enumerar propiedades enumerables y message no es enumerable.
En la especificación de ECMAScript, vemos en la sección sobre el constructor de errores que el constructor crea su mensaje (y otras propiedades) con el procedimiento:
Ejecute CreateNonEnumerableDataPropertyOrThrow ( O , "message", msg ).
Por supuesto, se pueden agregar otras propiedades (personalizadas) a los objetos Error mediante código JavaScript, lo que explica por qué Object.keys() enumera otras propiedades.
En cuanto a la salida de console.log : la implementación de la API de la console tiene mucha libertad sobre cómo mostrar objetos; se pueden encontrar muchas diferencias entre las implementaciones.
Para generar también esas propiedades no enumerables, use
console.log(Object.getOwnPropertyNames(error))Como dijo @trincot, no se muestra porque message es un atributo no enumerable para el constructor de errores, el MongoServerError está anulando el MongoError y en realidad esto está anulando el objeto JS Error, por lo que si necesita saber qué atributos tiene en el error puede consultar los enlaces anteriores para ver qué atributos puede verificar.
Además, si desea obtener todos los atributos (incluidos los no enumerables), puede usar Object.getOwnProperties(error) para ver todos los atributos que tiene el objeto dado.
También puede usar Object.getOwnPropertyDescriptors(error) para saber cuál es el descriptor de cada atributo que ha definido en el objeto dado.
Lamentablemente, la pila de errores y los campos de mensajes no son enumerables, a continuación se muestra una función de utilidad que extrae todas las propiedades de un objeto de error, incluso los campos personalizados que asigna a los errores:
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; };Prueba esto si estás usando api
console.log(error.message.toString())