Inteligencia de datos generativa

Cómo depurar una aplicación Node.js: consejos, trucos y herramientas

Fecha:

El desarrollo de software es complejo y, en algún momento, su aplicación Node.js fallará. Si eres afortunado, su código se bloqueará con un mensaje de error obvio. Si no tiene suerte, su aplicación continuará independientemente pero no generará los resultados que espera. Si realmente tienes mala suerte, todo funcionará bien hasta que el primer usuario descubra un error catastrófico de borrado de disco.

¿Qué es la depuración?

Depuración es el arte negro de arreglar defectos de software. La reparación de un error suele ser fácil: un carácter corregido o una línea de código adicional resuelve el problema. Encontrar ese error es otro asunto, y los desarrolladores pueden pasar muchas horas infelices tratando de localizar la fuente de un problema. Afortunadamente, Node.js tiene algunas herramientas excelentes para ayudar a rastrear errores.

Terminología

La depuración tiene su propia selección de jerga oscura, que incluye lo siguiente:

Término Explicación
punto de interrupción el punto en el que un depurador detiene un programa para que se pueda inspeccionar su estado
depurador Una herramienta que ofrece funciones de depuración, como ejecutar código línea por línea para inspeccionar estados variables internos
característica como en el reclamo: "no es un error, es una característica". Todos los desarrolladores lo dicen en algún momento de su carrera.
frecuencia con qué frecuencia o bajo qué condiciones ocurrirá un error
no funciona el informe de error más frecuente pero menos útil
punto de registro Una instrucción a un depurador para mostrar el valor de una variable en un punto durante la ejecución
registro salida de información de tiempo de ejecución a la consola o un archivo
error lógico el programa funciona pero no actúa según lo previsto
lista de prioridades donde se asigna un error en una lista de actualizaciones planificadas
condición de carrera los errores difíciles de rastrear dependen de la secuencia o el momento de los eventos incontrolables
refactorización reescribir el código para ayudar a la legibilidad y el mantenimiento
regresión reaparición de un error previamente corregido, tal vez debido a otras actualizaciones
relacionado un error que es similar o relacionado con otro
reproducir los pasos necesarios para causar el error
Error RTFM incompetencia del usuario disfrazada de informe de error, generalmente seguida de una respuesta a "Leer el Flipping Manual"
entrar en cuando ejecute código línea por línea en un depurador, ingrese a la función que se llama
salir cuando se ejecuta línea por línea, complete la ejecución de la función actual y regrese al código de llamada
dar un paso cuando se ejecuta línea por línea, completa la ejecución de un comando sin entrar en una función que llama
gravedad El impacto de un error en el sistema. Por ejemplo, la pérdida de datos normalmente se consideraría más problemática que un problema de IU a menos que la frecuencia de ocurrencia sea muy baja
rastro de la pila La lista histórica de todas las funciones llamadas antes de que ocurriera el error
error de sintaxis errores tipográficos, como console.lug()
error de usuario un error causado por un usuario en lugar de la aplicación, pero aún puede incurrir en una actualización dependiendo de la antigüedad de esa persona
reloj una variable para examinar durante la ejecución del depurador
punto de observación similar a un punto de interrupción, excepto que el programa se detiene cuando una variable se establece en un valor específico

Cómo evitar errores

Los errores a menudo se pueden evitar antes de probar su aplicación ...

Use un buen editor de código

Un buen editor de código ofrecerá numerosas características que incluyen numeración de líneas, autocompletado, codificación de colores, coincidencia de corchetes, formateo, sangría automática, cambio de nombre variable, reutilización de fragmentos, inspección de objetos, navegación de funciones, indicaciones de parámetros, refactorización, detección de códigos inalcanzables, sugerencias, verificación de tipos y más.

Los desarrolladores de Node.js tienen muchas opciones con editores gratuitos como Código VS, Atomy Soportes, así como muchas alternativas comerciales.

Use un código de interfaz

Un linter puede informar fallas de código como errores de sintaxis, sangría deficiente, variables no declaradas y corchetes que no coinciden antes de guardar y probar su código. Las opciones populares para JavaScript y Node.js incluyen ESLint, JSLinty JSHint.

A menudo se instalan como módulos globales de Node.js para que pueda ejecutar comprobaciones desde la línea de comandos:

eslint myfile.js

Sin embargo, la mayoría de las cartas tienen complementos de editor de código, como ESLint para el código VS y linter-eslint para Atom que verifica tu código mientras escribes:

ESLint para el código VS

Usar control de fuente

Un sistema de control de fuente como Git puede ayudar a proteger su código y administrar revisiones. ¡Es más fácil descubrir dónde y cuándo se introdujo un error y quién debería recibir la culpa! Repositorios en línea como GitHub y bitbucket Ofrecer espacio gratuito y herramientas de gestión.

Adoptar un sistema de seguimiento de problemas

¿Existe un error si nadie lo sabe? Se utiliza un sistema de seguimiento de problemas para informar errores, encontrar duplicados, documentar pasos de reproducción, determinar la gravedad, calcular prioridades, asignar desarrolladores, registrar discusiones y realizar un seguimiento del progreso de cualquier solución.

Los repositorios de fuentes en línea a menudo ofrecen un seguimiento básico de problemas, pero soluciones dedicadas puede ser apropiado para equipos y proyectos más grandes.

Usar desarrollo basado en pruebas

Desarrollo impulsado por pruebas (TDD) es un proceso de desarrollo que alienta a los desarrolladores a escribir código que pruebe el funcionamiento de una función antes de que se escriba, por ejemplo, se devuelve X cuando se pasa la función Y entrada Z.

Las pruebas se pueden ejecutar a medida que se desarrolla el código para demostrar que una función funciona y detectar cualquier problema a medida que se realizan más cambios. Dicho esto, tus pruebas también podrían tener errores ...

Dar un paso

Es tentador permanecer despierto toda la noche en un intento inútil de localizar la fuente de un error desagradable. No lo hagas Aléjate y haz otra cosa. Su cerebro trabajará inconscientemente en el problema y lo despertará a las 4 am con una solución. Incluso si eso no sucede, los ojos frescos detectarán ese punto y coma obvio que falta.

Depuración de Node.js: variables de entorno

Variables de entorno que se configuran dentro del sistema operativo host se pueden usar para controlar la configuración de la aplicación Node.js. Lo más común es NODE_ENV, que normalmente se establece en development Al depurar.

Las variables de entorno se pueden configurar en Linux / macOS:

NODE_ENV=development

Windows cmd:

set NODE_ENV=development

O Windows Powershell:

$env:NODE_ENV="development"

Internamente, una aplicación habilitará más funciones de depuración y mensajes. Por ejemplo:

// is NODE_ENV set to "development"?
const DEVMODE = (process.env.NODE_ENV === 'development'); if (DEVMODE) { console.log('application started in development mode on port ${PORT}');
}

NODE_DEBUG habilita la depuración de mensajes utilizando Node.js util.debuglog (consulte a continuación), pero también consulte la documentación de sus módulos y marcos principales para descubrir otras opciones.

Tenga en cuenta que las variables de entorno también se pueden guardar en un .env archivo. Por ejemplo:

NODE_ENV=development
NODE_LOG=./log/debug.log
SERVER_PORT=3000
DB_HOST=localhost
DB_NAME=mydatabase

Luego cargado usando el dotenv módulo:

require('dotenv').config();

Depuración de Node.js: Opciones de línea de comandos

Varios opciones de línea de comandos se puede pasar a la node tiempo de ejecución al iniciar una aplicación. Uno de los más útiles es --trace-warnings, que genera seguimientos de pila para advertencias de proceso (incluidas las depreciaciones).

Se puede establecer cualquier cantidad de opciones, que incluyen:

  • --enable-source-maps: habilitar mapas fuente (experimental)
  • --throw-deprecation: arroja errores cuando se utilizan características obsoletas
  • --inspect: active el inspector V8 (ver más abajo)

A modo de ejemplo, intentemos iniciar sesión el módulo criptográfico DEFAULT_ENCODING perfecta, que quedó en desuso en el Nodo v10:

const crypto = require('crypto'); function bar() { console.log(crypto.DEFAULT_ENCODING);
} function foo(){ bar();
} foo();

Ahora ejecute esto con lo siguiente:

node index.js

Luego veremos esto:

buffer
(node:7405) [DEP0091] DeprecationWarning: crypto.DEFAULT_ENCODING is deprecated.

Sin embargo, también podemos hacer esto:

node --trace-warnings index.js

Eso produce lo siguiente:

buffer
(node:7502) [DEP0091] DeprecationWarning: crypto.DEFAULT_ENCODING is deprecated. at bar (/home/Desktop/index.js:4:22) at foo (/home/Desktop/index.js:8:3) at Object.<anonymous> (/home/Desktop/index.js:11:1) at Module._compile (internal/modules/cjs/loader.js:1151:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1171:10) at Module.load (internal/modules/cjs/loader.js:1000:32) at Function.Module._load (internal/modules/cjs/loader.js:899:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) at internal/main/run_main_module.js:17:47

Esto nos dice que la advertencia de desaprobación proviene del código en la línea 4 (el console.log declaración), que se ejecutó cuando el bar funcionó la función. los bar la función fue llamada por el foo funcionar en la línea 8 y el foo La función se llamó en la línea 11 de nuestro script.

Tenga en cuenta que las mismas opciones también se pueden pasar a Nodemon.

Depuración de consola

Una de las formas más fáciles de depurar una aplicación es generar valores en la consola durante la ejecución:

console.log( myVariable );

Pocos desarrolladores profundizan más allá de este humilde comando de depuración, pero se están perdiendo muchas más posibilidades, incluyendo estos:

console.log() acepta una lista de valores separados por comas. Por ejemplo:

let x = 123;
console.log('x:', x);
// x: 123

Sin embargo, ES6 desestructuración puede ofrecer resultados similares con menos esfuerzo de tipeo:

console.log({x});
// { x: 123 }

Los objetos más grandes se pueden generar como una cadena condensada usando esto:

console.log( JSON.stringify(obj) );

util.inspect formateará objetos para facilitar la lectura, pero console.dir() hace el trabajo duro por ti.

Node.js util.debuglog

El Node.js util módulo ofrece un incorporado debuglog método que escribe mensajes condicionalmente STDERR:

const util = require('util');
const debuglog = util.debuglog('myapp'); debuglog('myapp debug message [%d]', 123);

Cuando el NODE_DEBUG la variable de entorno se establece en myapp (o un comodín como * or my*), los mensajes se muestran en la consola:

NODE_DEBUG=myapp node index.js
MYAPP 9876: myapp debug message [123]

Aquí, 9876 es el ID de proceso de Node.js.

De forma predeterminada, util.debuglog Es silencioso. Si tuviera que ejecutar el script anterior sin establecer un NODE_DEBUG variable, no se enviaría nada a la consola. Esto le permite dejar un registro de depuración útil en su código sin saturar la consola para su uso regular.

Depuración con módulos de registro

Los módulos de registro de terceros están disponibles en caso de que necesite opciones más sofisticadas para los niveles de mensajería, verbosidad, clasificación, salida de archivos, creación de perfiles y más. Las opciones populares incluyen:

Inspector de Node.js V8

En las siguientes secciones, el proyecto pagehit desarrollado en otros tutoriales se usa para ilustrar conceptos de depuración. Puedes descargarlo con:

git clone https://github.com/sitepoint-editors/pagehit-ram

O puede usar cualquiera de sus propios códigos.

Node.js es un contenedor del motor V8 JavaScript que incluye su propio inspector y cliente de depuración. Para comenzar, use el inspect argumento (no debe confundirse con --inspect) para iniciar una aplicación:

node inspect ./index.js

El depurador hará una pausa en la primera línea y mostrará un debug> rápido:

< Debugger listening on ws://127.0.0.1:9229/6f38abc1-8568-4035-a5d2-dee6cbbf7e44
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in index.js:7 5 const 6 // default HTTP port
> 7 port = 3000, 8 9 // Node.js modules
debug>

Puede recorrer la aplicación ingresando:

  • cont or c: continuar ejecución
  • next or n: ejecuta el siguiente comando
  • step or s: entrar en una función que se llama
  • out or o: salir de una función y volver al comando de llamada
  • pause: pausa código en ejecución

Otras opciones incluyen:

  • viendo valores variables con watch('myvar')
  • establecer puntos de interrupción con el setBreakpoint()/sb() comando (generalmente es más fácil insertar un debugger; declaración en su código)
  • restart un guión
  • .exit el depurador (el inicial . es requerido)

Si esto suena horriblemente torpe, es. Solo use el cliente de depuración incorporado cuando no haya absolutamente ninguna otra opción, se sienta particularmente masoquista y no esté usando Windows (a menudo es problemático).

Node.js Depuración con Chrome

El inspector Node.js (sin el cliente del depurador) se inicia con el --inspect bandera:

node --inspect ./index.js

Nota: nodemon se puede usar en lugar de node si necesario.

Esto inicia el depurador escuchando 127.0.0.1:9229, que cualquier cliente de depuración local puede adjuntar a:

Debugger listening on ws://127.0.0.1:9229/20ac75ae-90c5-4db6-af6b-d9d74592572f

Si está ejecutando la aplicación Node.js en otro dispositivo o contenedor Docker, asegúrese de puerto 9229 es accesible y otorga acceso remoto usando esto:

node --inspect=0.0.0.0:9229 ./index.js

Alternativamente, puede utilizar --inspect-brk para establecer un punto de interrupción en la primera instrucción para que la aplicación se pause inmediatamente.

Abre Chrome y entra chrome://inspect en la barra de direcciones.

Chrome inspeccionar

Nota: si la aplicación Node.js no aparece como un Objetivo remoto, asegurar Descubre objetivos de red está marcado, luego haga clic Configurar para agregar la dirección IP y el puerto del dispositivo donde se ejecuta la aplicación.

Haga clic en el objetivo inspeccionar enlace para iniciar DevTools. Será inmediatamente familiar para cualquiera con experiencia en depuración del navegador.

DevTools de Chrome

El proyecto + Agregar carpeta al espacio de trabajo El enlace le permite seleccionar dónde se ubican los archivos Node.js en su sistema, por lo que es más fácil cargar otros módulos y realizar cambios.

Al hacer clic en cualquier número de línea se establece un punto de interrupción, denotado por un marcador verde, que detiene la ejecución cuando se alcanza ese código:

Punto de corte de Chrome DevTools

Se pueden agregar variables a la Ver ahora panel a la derecha haciendo clic en el + icono e ingresando su nombre. Su valor se muestra cada vez que se detiene la ejecución.

El proyecto Pila de llamadas El panel muestra qué funciones fueron llamadas para llegar a este punto.

El proyecto Lo que hacemos El panel muestra el estado de todas las variables locales y globales disponibles.

El proyecto Los puntos de interrupción El panel muestra una lista de todos los puntos de interrupción y permite habilitarlos o deshabilitarlos.

Los íconos sobre el Depurador en pausa El mensaje se puede utilizar para reanudar la ejecución, pasar, entrar, salir, pasar, desactivar todos los puntos de interrupción y pausar las excepciones.

Node.js Depuración con código VS

La depuración de VS Code Node.js se puede iniciar sin ninguna configuración cuando ejecuta una aplicación Node.js en su sistema local. Abra el archivo de inicio (normalmente index.js), active el Ejecutar y depurar panel, y haga clic en Ejecutar y depurar Node.js (F5) del botón.

Depurador de código VS

La pantalla de depuración es similar a Chrome DevTools con un Variables, Ver ahora, Pila de llamadas, Guiones cargadosy Los puntos de interrupción lista.

Punto de interrupción del código VS

Se puede establecer un punto de interrupción haciendo clic en la canaleta al lado del número de línea. También puedes hacer clic derecho.

Opciones de punto de interrupción del código VS

Con este clic derecho, puede configurar lo siguiente:

  1. Un punto de corte estándar.

  2. Un punto de interrupción condicional que se detiene cuando se cumplen los criterios, por ejemplo, count > 3.

  3. Un punto de registro, que es efectivamente console.log() sin código! Se puede ingresar cualquier cadena con expresiones denotadas entre llaves, por ejemplo, {count} para mostrar el valor de count variable.

    Punto de registro de código VS

Nota: no olvides golpear Ida y vuelta para VS Code para crear su punto de interrupción condicional o punto de registro.

La barra de iconos de depuración en la parte superior se puede utilizar para reanudar la ejecución, pasar, entrar, salir, reiniciar o detener la aplicación y la depuración. Opciones idénticas también están disponibles en Depurar elemento en el menú.

Para obtener más información, consulte Depuración en el código de Visual Studio.

Configuración avanzada de depuración

Se requiere una configuración adicional cuando depura un servicio remoto o necesita usar diferentes opciones de inicio. VS Code almacena configuraciones de lanzamiento en un launch.json archivo generado dentro del .vscode carpeta dentro de su proyecto. Para generar o editar el archivo, haga clic en el icono de engranaje en la parte superior derecha de la Ejecutar y depurar cristal.

Configuración de inicio de VS Code

Se puede agregar cualquier cantidad de ajustes de configuración a configurations formación. Haga clic en el Agregar configuración botón para elegir una opción. VS Code puede:

  1. lanzamiento un proceso usando Node.js mismo, o
  2. adjuntar a un proceso de inspector de Node.js, tal vez ejecutándose en una máquina remota o contenedor Docker

En el ejemplo anterior, se ha definido una única configuración de inicio de Nodemon. Salvar launch.json, seleccione nodemon de la lista desplegable en la parte superior de la Ejecutar y depurar panel y haga clic en el icono de inicio verde.

Lanzamiento de VS Code

Para más información, ver Configuraciones de lanzamiento de código VS.

El proyecto Guía de depuración de Node.js proporciona consejos para otros IDEs y editores, incluidos Visual Studio, JetBrains, WebStorm, Gitpod y Eclipse. Atom también tiene un depuración de nodos extensión.

ndb ofrece un Experiencia de depuración mejorada con potentes funciones como la conexión a procesos secundarios y el blackboxing de scripts para que solo se muestre el código en carpetas específicas.

El proyecto Kit de herramientas de informes de IBM para Node.js funciona analizando la salida de datos cuando node se ejecuta con el --experimental-report .

Finalmente, servicios comerciales como LogRocket y Centinela.io integre con su aplicación web en vivo tanto en el cliente como en el servidor para registrar errores a medida que los usuarios los encuentren.

¡Obtenga depuración!

Node.js tiene una gama de excelentes herramientas de depuración y analizadores de código que pueden mejorar la velocidad y la confiabilidad de su aplicación. Si pueden o no tentarlo lejos de console.log() es otro asunto!

Fuente: https://www.sitepoint.com/debug-node-app-tips-tricks-tools/?utm_source=rss

punto_img

Información más reciente

punto_img