Normalmente simplemente registro el error, o tal vez lo haga console.log(err.message) , pero uno de nuestros servidores devuelve un volcado de datos de información. Dado que Javascript trunca los objetos, la parte pertinente del error se oscurece.
Así que el error completo será así
request:{ // thousands of lines // ... // several levels deep there will be a pertinent portion buried deep within the error error:{ en: { message:{ "Here is the super specific error info which I care about"Este registro terminará así
request:{ // thousands of lines Object // <- it's in there Idealmente, simplemente registraría la parte importante que me importa, pero para llegar a esta parte del objeto, tengo que inspeccionar el error console.log(util.inspect(err, false, null)) , que entrega un volcado de datos de más de 5000 líneas que contiene nuestras claves en numerosos lugares.
En un momento estaba haciendo esto
var errorMsgIs = ""; if (err.response && err.response.body && err.response.body.error && err.response.body.error.en) { errorMsgIs = err.response.body.error.en } console.log(loggit, "Bank Error on Nodes.create inside addARInfo: ", err, errorMsgIs);Pero eso solo funciona si la estructura nunca cambia en función del error.
Es la solución para encontrar algún tipo de función de limpieza para peinar las 5000 líneas, nivel por nivel y verificar específicamente las claves, luego hacer un .replace , he pensado en ir por esa ruta.
¿Cuál es la mejor manera de registrar estos errores masivos para que pueda obtener los datos pertinentes que necesito enterrados profundamente en el error sin exponer nuestras claves en los registros?
Sí, debe recorrer las propiedades del objeto y buscar su estructura de datos. Con una función recursiva, es bastante fácil:
/** * Retrieve an error message from an error object. * @param {object} obj * @returns {string | undefined} */ function getErrorMessage(obj) { const props = Object.values(obj); for (let i = 0; i < props.length; i++) { const element = props[i]; if (typeof element === 'object') { if (element.error?.en?.message) return element.error.en.message; const result = getErrorMessage(element); if (result) return result; } } } const data = {/* ... */}; // your data object console.log(getErrorMessage(data));Tenga en cuenta que esto está usando la sintaxis ES2020+ (para encadenamiento opcional). Si no tiene acceso a ese nivel de ES, puede usar su sintaxis inicial:
if (element.error && element.error.en && element.error.en.message) return element.error.en.message;