A menudo, cuando falla una afirmación, quiero ver qué tipo de datos causaron el problema. Eso es muy fácil con las herramientas de desarrollo del navegador, ya que puedo ver los valores en la pila. Pero es más difícil para node.js.
¿Hay alguna forma sencilla de mostrar el seguimiento de la pila, así como los valores defectuosos cuando falla una afirmación, en un script node.js de corta duración?
Este es un problema al que se enfrentan casi todos los desarrolladores de nodos, ¿verdad? Me sorprende que no haya una solución obvia entonces.
Como manejas esto?
Aquí hay un ejemplo mínimo para mostrar el problema:
import {strict as assert} from 'assert'; function sameX(a, b){ return ax==bx; } const a={x:1}; a.self=a; const b={x:2}; b.self=b; Digamos que espero que sameX(a,b) devuelva verdadero. Si no es así, deseo imprimir un mensaje de error, mostrar el seguimiento de la pila y mostrar el valor actual de esas variables.
¿Cómo puedo hacerlo bien en el nodo?
assert Intento fallido: argumentos adicionales para la afirmación del nodo assert(sameX(a,b), "Objects with unexpected x", a, b);Esto, por supuesto, solo imprime:
Objetos con x inesperado
ya que la afirmación del nodo solo toma dos parámetros .
assert(sameX(a,b), `Objects with unexpected x ${a} ${b}`);Esto imprime:
Objetos con x inesperado [objeto Objeto] [objeto Objeto]
b a
Algo similar a:
assert(sameX(a,b), `Objects with unexpected x ${JSON.stringify(a)} ${JSON.stringify(b)}`); No solo es complicado escribirlo, sino que puede fallar en algunos casos (como en este ejemplo donde a y b tienen referencias circulares).
console.assert console.assert(sameX(a,b), "Objects with unexpected x", a, b);Esto imprime un mensaje de error que me gusta:
Objetos con x inesperado <ref *1> { x: 1, self: [Circular *1] } <ref *1> { x: 2, self: [Circular *1] }
Sin embargo, no arroja una excepción y, por lo tanto, ni siquiera muestra el seguimiento de la pila. Quiero ver el seguimiento de la pila.
Es posible depurar Node utilizando las herramientas de desarrollo de un navegador .
Esto funciona, pero no es una buena opción para una secuencia de comandos de corta duración o de un solo disparo que finaliza en milisegundos.
Ahora, si hubiera algo como una terminal que incrustara las herramientas de desarrollo y las conectara a la instancia de Node cuando una está en ejecución, sería perfecto. Pero no conozco ninguna terminal de este tipo.
Por supuesto que puedo definir mi propia función de afirmación:
function assert(cond, ...msg){ if(!cond){ console.error("Assertion Failed!", ...msg); throw new Error(msg[0]); } } Pero tendría que copiarlo y pegarlo en cada proyecto mío y carecería de todas las características de la afirmación del nodo (por ejemplo, necesitaría implementar assert.deepEqual por separado, si lo necesito).
Una mejor alternativa podría ser usar una biblioteca existente. ¿Qué biblioteca debo usar para esto? Después de buscar un poco, no pude encontrar ninguna biblioteca generalizada para este caso de uso. La mayoría de las bibliotecas de aserciones están destinadas a conjuntos de pruebas y son demasiado pesadas para la producción.