{"id":49501,"date":"2022-03-17T09:58:16","date_gmt":"2022-03-17T08:58:16","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=49501&#038;preview=true&#038;preview_id=49501"},"modified":"2025-01-31T14:40:59","modified_gmt":"2025-01-31T13:40:59","slug":"node-debug","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/node-debug\/","title":{"rendered":"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas"},"content":{"rendered":"<p><a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-node-js\/\">Node.js es un JavaScript runtime<\/a> basado en el mismo motor V8 utilizado en el navegador Chrome de Google. Se suele utilizar para crear aplicaciones multiplataforma del lado del servidor y del terminal. <a href=\"https:\/\/kinsta.com\/es\/blog\/node-js-aplicaciones\/\">Node.js se ha hecho cada vez m\u00e1s popular<\/a> en la \u00faltima d\u00e9cada porque es <a href=\"https:\/\/kinsta.com\/es\/blog\/como-instalar-node-js\/\">f\u00e1cil de instalar<\/a>, pr\u00e1ctico de usar, r\u00e1pido y permite a los desarrolladores web del lado del cliente <a href=\"https:\/\/kinsta.com\/es\/blog\/salario-desarrolladores-node-js\/\">aprovechar sus habilidades en otro lugar<\/a>.<\/p>\n<p>Sin embargo, el desarrollo de software sigue siendo una tarea compleja, y tu c\u00f3digo Node.js fallar\u00e1 en alg\u00fan momento. Este tutorial muestra varias herramientas para ayudar a depurar las aplicaciones y encontrar la causa de un problema.<\/p>\n<p>Entremos de lleno.<\/p>\n<h3>Consulta Nuestro VideoTutorial para <a href=\"https:\/\/www.youtube.com\/watch?v=Kz8EB9Lhul8\">Depurar el C\u00f3digo de Node.js<\/a><\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=Kz8EB9Lhul8\"><\/kinsta-video>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><\/p>\n<p><a href=\"https:\/\/deno.land\/\" target=\"_blank\" rel=\"noopener noreferrer\">Deno<\/a> es un runtime de JavaScript alternativo. Es similar a Node.js pero m\u00e1s nuevo, y suaviza algunas de las grietas e inconsistencias. Las herramientas y la informaci\u00f3n que aparecen a continuaci\u00f3n pueden aplicarse a menudo a las aplicaciones Deno y Node.js.<br \/><\/p>\n<\/aside>\n\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Visi\u00f3n general de la depuraci\u00f3n<\/h2>\n<p>\u00abDepuraci\u00f3n\u00bb es el nombre que se da a las distintas herramientas para arreglar los defectos del software. Arreglar un fallo suele ser sencillo. Encontrar la causa del fallo puede ser bastante m\u00e1s complejo y requerir muchas horas de trabajo duro.<\/p>\n<p>En los siguientes apartados se describen tres tipos generales de errores con los que te encontrar\u00e1s.<\/p>\n<h3>Errores de sintaxis<\/h3>\n<p>Tu c\u00f3digo no sigue las reglas del lenguaje &#8211; por ejemplo, cuando omites un corchete de cierre o escribes mal una sentencia como <code>console.lag(x)<\/code>.<\/p>\n<p>Un buen editor de c\u00f3digo puede ayudar a detectar los problemas m\u00e1s comunes:<\/p>\n<ul>\n<li>Codificaci\u00f3n por colores de las declaraciones v\u00e1lidas o no v\u00e1lidas<\/li>\n<li>Comprobaci\u00f3n de tipo de las variables<\/li>\n<li>Autocompletar nombres de funciones y variables<\/li>\n<li>Resaltar par\u00e9ntesis coincidentes<\/li>\n<li>Autoindentaci\u00f3n de bloques de c\u00f3digo<\/li>\n<li>Detecci\u00f3n de c\u00f3digo no accesible<\/li>\n<li>Refactorizaci\u00f3n de funciones desordenadas<\/li>\n<\/ul>\n<p>Los <a href=\"https:\/\/kinsta.com\/es\/blog\/editores-html-gratuitos\/\">editores gratuitos<\/a> como <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">VS Code<\/a> y <a href=\"https:\/\/atom.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Atom<\/a> tienen un gran soporte para Node.js, JavaScript y TypeScript (que se transpila a JavaScript). Los problemas b\u00e1sicos de sintaxis suelen detectarse antes de guardar y probar el c\u00f3digo.<\/p>\n<p>Un linter de c\u00f3digo como <a href=\"https:\/\/eslint.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">ESLint<\/a> tambi\u00e9n informar\u00e1 de los errores de sintaxis, de la mala indentaci\u00f3n y de las variables no declaradas. ESLint es una herramienta de Node.js que puedes instalar globalmente:<\/p>\n<pre><code class=\"language-bash\">npm i eslint -g<\/code><\/pre>\n<p>Puedes comprobar los archivos JavaScript desde la l\u00ednea de comandos utilizando:<\/p>\n<pre><code class=\"language-bash\">eslint mycode.js<\/code><\/pre>\n<p>&#8230;pero es m\u00e1s f\u00e1cil utilizar un plugin del editor como <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=dbaeumer.vscode-eslint\" target=\"_blank\" rel=\"noopener noreferrer\">ESLint para VS Code<\/a> o <a href=\"https:\/\/atom.io\/packages\/linter-eslint\" target=\"_blank\" rel=\"noopener noreferrer\">linter-eslint para Atom<\/a>, que validan autom\u00e1ticamente el c\u00f3digo mientras escribes:<\/p>\n<figure id=\"attachment_115102\" aria-describedby=\"caption-attachment-115102\" style=\"width: 913px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115102\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/eslint-vscode.png\" alt=\"ESlint in VS Code\" width=\"913\" height=\"564\"><figcaption id=\"caption-attachment-115102\" class=\"wp-caption-text\">ESlint en VS Code.<\/figcaption><\/figure>\n<h3>Errores l\u00f3gicos<\/h3>\n<p>Tu c\u00f3digo se ejecuta pero no funciona como esperas. Por ejemplo, un usuario no cierra la sesi\u00f3n cuando lo solicita; un informe muestra cifras incorrectas; los datos no se guardan completamente en una base de datos; etc.<\/p>\n<p>Los errores l\u00f3gicos pueden ser causados por:<\/p>\n<ul>\n<li>Uso de una variable incorrecta<\/li>\n<li>Condiciones incorrectas, por ejemplo, <code>if (a &gt; 5)<\/code> en lugar de <code>if (a &lt; 5)<\/code><\/li>\n<li>C\u00e1lculos que no tienen en cuenta la precedencia de los operadores, por ejemplo, <code>1+2*3<\/code> da como resultado 7 en lugar de 9.<\/li>\n<\/ul>\n\n<h3>Errores de tiempo de ejecuci\u00f3n (o errores runtime)<\/h3>\n<p>Un error s\u00f3lo se hace evidente cuando se ejecuta la aplicaci\u00f3n, lo que suele provocar un fallo. Los errores de ejecuci\u00f3n pueden ser causados por:<\/p>\n<ul>\n<li>Dividir por una variable que se ha puesto a cero<\/li>\n<li>Intentar acceder a un elemento de la matriz que no existe<\/li>\n<li>Intentar escribir en un archivo de s\u00f3lo lectura<\/li>\n<\/ul>\n<p>Los errores l\u00f3gicos y de ejecuci\u00f3n son m\u00e1s dif\u00edciles de detectar, aunque las siguientes t\u00e9cnicas de desarrollo pueden ayudar:<\/p>\n<ol>\n<li><strong>Utiliza el Desarrollo Orientado a Pruebas:<\/strong> TTD te anima a escribir pruebas antes de que se desarrolle una funci\u00f3n, por ejemplo, X se devuelve de la funci\u00f3nY cuando se pasa Z como par\u00e1metro. Estas pruebas se ejecutan durante el desarrollo inicial y las actualizaciones posteriores para garantizar que el c\u00f3digo sigue funcionando como se espera.<\/li>\n<li><strong>Utiliza un sistema de seguimiento de incidencias: <\/strong>No hay nada peor que un correo electr\u00f3nico en el que se diga <i>\u00abTu software no funciona\u00bb<\/i> Los sistemas de seguimiento de incidencias te permiten registrar problemas espec\u00edficos, documentar los pasos de reproducci\u00f3n, determinar prioridades, asignar desarrolladores y seguir el progreso de las correcciones.<\/li>\n<li><strong>Utiliza el control del c\u00f3digo fuente: <\/strong>Un sistema de control de fuentes <a href=\"https:\/\/kinsta.com\/es\/blog\/git-vs-github\/\">como Git<\/a> te ayudar\u00e1 a hacer copias de seguridad del c\u00f3digo, gestionar las revisiones e identificar d\u00f3nde se ha introducido un error. Los repositorios online, como <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-github\/\">Github<\/a> y <a href=\"https:\/\/kinsta.com\/es\/blog\/bitbucket-vs-github\/\">Bitbucket,<\/a> ofrecen espacio y herramientas gratuitas para proyectos m\u00e1s peque\u00f1os o de c\u00f3digo abierto.<\/li>\n<\/ol>\n<p>Seguir\u00e1s encontrando errores de Node.js, pero las siguientes secciones describen las formas de localizar ese escurridizo error.<\/p>\n<h2>Establece las variables de entorno de Node.js adecuadas<\/h2>\n<p>Las variables de entorno establecidas en el sistema operativo del host pueden controlar la configuraci\u00f3n de la aplicaci\u00f3n y los m\u00f3dulos de Node.js. La m\u00e1s com\u00fan es <code>NODE_ENV<\/code>, que normalmente se establece en desarrollo cuando se depura o en producci\u00f3n cuando se ejecuta en un servidor en vivo. Establece las variables de entorno en macOS o Linux con el <a href=\"https:\/\/kinsta.com\/es\/blog\/linux-comandos\/\">comando<\/a>:<\/p>\n<pre><code class=\"language-js\">NODE_ENV=development<\/code><\/pre>\n<p>o en el s\u00edmbolo del sistema (cl\u00e1sico) de Windows:<\/p>\n<pre><code class=\"language-js\">set NODE_ENV=development<\/code><\/pre>\n<p>o en Windows Powershell:<\/p>\n<pre><code class=\"language-js\">$env:NODE_ENV=\"development\"<\/code><\/pre>\n<p>En el popular <a href=\"http:\/\/expressjs.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">framework Express.js<\/a>, al establecer NODE_ENV como desarrollo se desactiva el almacenamiento en cach\u00e9 de los archivos de plantilla y se emiten mensajes de error detallados, lo que puede ser \u00fatil para la depuraci\u00f3n. Otros m\u00f3dulos pueden ofrecer caracter\u00edsticas similares, y puedes a\u00f1adir una condici\u00f3n NODE_ENV a tus aplicaciones, por ejemplo<\/p>\n<pre><code class=\"language-js\">\/\/ running in development mode?\nconst devMode = (process.env.NODE_ENV !== 'production');\n\nif (devMode) {\n  console.log('application is running in development mode');\n}\n<\/code><\/pre>\n<p>Tambi\u00e9n puedes utilizar el m\u00e9todo <a href=\"https:\/\/nodejs.org\/api\/util.html#utildebuglogsection-callback\" target=\"_blank\" rel=\"noopener noreferrer\">util.debuglog<\/a> de Node para emitir mensajes de error de forma condicional, por ejemplo<\/p>\n<pre><code class=\"language-js\">import { debuglog } from 'util';\nconst myappDebug = debuglog('myapp');\nmyappDebug('log something');\n<\/code><\/pre>\n<p>Esta aplicaci\u00f3n s\u00f3lo emitir\u00e1 el mensaje de registro cuando NODE_DEBUG se establezca como myapp o un comod\u00edn como * o my*.<\/p>\n<h2>Utiliza las opciones de la l\u00ednea de comandos de Node.js<\/h2>\n<p>Los scripts de Node suelen lanzarse con node seguido del nombre del script de entrada:<\/p>\n<pre><code class=\"language-js\">node app.js<\/code><\/pre>\n<p>Tambi\u00e9n puedes establecer opciones de l\u00ednea de <a href=\"https:\/\/nodejs.org\/api\/cli.html\" target=\"_blank\" rel=\"noopener noreferrer\">comandos<\/a> para controlar varios aspectos del tiempo de ejecuci\u00f3n. Las banderas \u00fatiles para la depuraci\u00f3n incluyen:<\/p>\n<ul>\n<li><code>--check<\/code><br \/>\ncomprueba la sintaxis del script sin ejecutar<\/li>\n<li><code>--trace-warnings<\/code><br \/>\nmostrar un seguimiento de la pila cuando JavaScript Promises no se resuelven o se rechazan<\/li>\n<li><code>--enable-source-maps<\/code><br \/>\nmostrar los mapas de origen cuando se utiliza un transpilador como TypeScript<\/li>\n<li><code>--throw-deprecation<\/code><br \/>\navisar cuando se utilicen funciones obsoletas de Node.js<\/li>\n<li><code>--redirect-warnings=file<\/code><br \/>\nenviar las advertencias a un archivo en lugar de a stderr<\/li>\n<li><code>--trace-exit<\/code><br \/>\nmostrar un seguimiento de la pila cuando se llama a <code>process.exit()<\/code>.<\/li>\n<\/ul>\n<h2>Salida de mensajes en la consola<\/h2>\n<p>Dar salida a un mensaje en la consola es una de las formas m\u00e1s sencillas de depurar una aplicaci\u00f3n Node.js:<\/p>\n<pre><code class=\"language-js\">console.log(`someVariable: ${ someVariable }`);<\/code><\/pre>\n<p>Pocos desarrolladores se dan cuenta de que hay muchos otros m\u00e9todos de consola:<\/p>\n<div class=\"responsive-table\">\n<table>\n<thead>\n<tr>\n<th>M\u00e9todo de la consola<\/th>\n<th>Descripci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>.log(msg)<\/code><\/td>\n<td>mensaje de consola est\u00e1ndar<\/td>\n<\/tr>\n<tr>\n<td><code>.log('%j', obj)<\/code><\/td>\n<td>salida del objeto como una cadena JSON compacta<\/td>\n<\/tr>\n<tr>\n<td><code>.dir(obj, opt)<\/code><\/td>\n<td>imprimir las propiedades de los objetos en formato pretty-print<\/td>\n<\/tr>\n<tr>\n<td><code>.table(obj)<\/code><\/td>\n<td>salida de arrays y objetos en formato tabular<\/td>\n<\/tr>\n<tr>\n<td><code>.error(msg)<\/code><\/td>\n<td>un mensaje de error<\/td>\n<\/tr>\n<tr>\n<td><code>.count(label)<\/code><\/td>\n<td>incrementar un contador con nombre y salida<\/td>\n<\/tr>\n<tr>\n<td><code>.countReset(label)<\/code><\/td>\n<td>restablecer un contador con nombre<\/td>\n<\/tr>\n<tr>\n<td><code>.group(label)<\/code><\/td>\n<td>sangrar un grupo de mensajes<\/td>\n<\/tr>\n<tr>\n<td><code>.groupEnd(label)<\/code><\/td>\n<td>termina un grupo<\/td>\n<\/tr>\n<tr>\n<td><code>.time(label)<\/code><\/td>\n<td>inicia un temporizador con nombre<\/td>\n<\/tr>\n<tr>\n<td><code>.timeLog(label)<\/code><\/td>\n<td>informa del tiempo transcurrido<\/td>\n<\/tr>\n<tr>\n<td><code>.timeEnd(label)<\/code><\/td>\n<td>detiene un temporizador con nombre<\/td>\n<\/tr>\n<tr>\n<td><code>.trace()<\/code><\/td>\n<td>muestra un seguimiento de la pila (una lista de todas las llamadas a funciones realizadas)<\/td>\n<\/tr>\n<tr>\n<td><code>.clear()<\/code><\/td>\n<td>borra la consola<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><code>console.log()<\/code> tambi\u00e9n acepta una lista de valores separados por comas:<\/p>\n<pre><code class=\"language-js\">let x = 123;\nconsole.log('x:', x);\n\/\/ x: 123\n<\/code><\/pre>\n<p>&#8230;aunque la desestructuraci\u00f3n de ES6 ofrece un resultado similar con menos esfuerzo:<\/p>\n<pre><code class=\"language-js\">console.log({ x });\n\/\/ { x: 123 }\n<\/code><\/pre>\n<p>El comando <strong>console.dir(<\/strong> ) imprime las propiedades de los objetos del mismo modo que <a href=\"https:\/\/nodejs.org\/api\/util.html#utilinspectobject-options\" target=\"_blank\" rel=\"noopener noreferrer\">util.inspect()<\/a>:<\/p>\n<pre><code class=\"language-js\">console.dir(myObject, { depth: null, color: true });<\/code><\/pre>\n<h3>Controversia sobre la consola<\/h3>\n<p>Algunos desarrolladores afirman que <i>nunca<\/i> debes utilizar <code>console.log()<\/code> porque:<\/p>\n<ul>\n<li>Est\u00e1s cambiando el c\u00f3digo y puedes alterar algo u olvidar eliminarlo, y<\/li>\n<li>No es necesario cuando hay mejores opciones de depuraci\u00f3n.<\/li>\n<\/ul>\n<p>\u00a1No creas a nadie que diga que nunca usa <code>console.log()<\/code>! El registro es r\u00e1pido y sucio, pero todo el mundo lo utiliza en alg\u00fan momento. Utiliza la herramienta o t\u00e9cnica que prefieras. Solucionar un fallo es m\u00e1s importante que el m\u00e9todo que adoptes para encontrarlo.<\/p>\n<h2>Utiliza un sistema de registro de terceros<\/h2>\n<p>Los sistemas de registro de terceros proporcionan funciones m\u00e1s sofisticadas, como niveles de mensajer\u00eda, verbosidad, clasificaci\u00f3n, salida de archivos, elaboraci\u00f3n de perfiles, informes y mucho m\u00e1s. Las soluciones m\u00e1s populares son <a href=\"https:\/\/www.npmjs.com\/package\/cabin\" target=\"_blank\" rel=\"noopener noreferrer\">cabin<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/loglevel\" target=\"_blank\" rel=\"noopener noreferrer\">loglevel<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/morgan\" target=\"_blank\" rel=\"noopener noreferrer\">morgan<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/pino\" target=\"_blank\" rel=\"noopener noreferrer\">pino<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/signale\" target=\"_blank\" rel=\"noopener noreferrer\">signale<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/storyboard\" target=\"_blank\" rel=\"noopener noreferrer\">storyboard<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/tracer\" target=\"_blank\" rel=\"noopener noreferrer\">tracer<\/a> y <a href=\"https:\/\/www.npmjs.com\/package\/winston\" target=\"_blank\" rel=\"noopener noreferrer\">winston<\/a>.<\/p>\n<h2>Utiliza el Inspector V8<\/h2>\n<p>El motor V8 de JavaScript proporciona un <a href=\"https:\/\/nodejs.org\/api\/debugger.html\" target=\"_blank\" rel=\"noopener noreferrer\">cliente de depuraci\u00f3n<\/a> que puedes utilizar en Node.js. Inicia una aplicaci\u00f3n utilizando node inspect, por ejemplo<\/p>\n<pre><code class=\"language-js\">node inspect app.js<\/code><\/pre>\n<p>El depurador se detiene en la primera l\u00ednea y muestra un aviso de depuraci\u00f3n&gt;:<\/p>\n<pre><code class=\"language-js\">$ node inspect .\\mycode.js\n&lt; Debugger listening on ws:\/\/127.0.0.1:9229\/143e23fb\n&lt; For help, see: https:\/\/nodejs.org\/en\/docs\/inspector\n&lt;\n ok\n&lt; Debugger attached.\n&lt;\nBreak on start in mycode.js:1\n&gt; 1 const count = 10;\n  2\n  3 for (i = 0; i &lt; counter; i++) {\ndebug&gt;\n<\/code><\/pre>\n<p>Utiliza la ayuda para ver una lista de comandos. Puedes avanzar por la aplicaci\u00f3n introduciendo:<\/p>\n<ul>\n<li><strong>cont<\/strong> o <strong>c<\/strong>: continuar la ejecuci\u00f3n<\/li>\n<li><strong>next<\/strong> o <strong>n<\/strong>: ejecutar el siguiente comando<\/li>\n<li><strong>step<\/strong> o <strong>s<\/strong>: entrar en una funci\u00f3n a la que se llama<\/li>\n<li><strong>out<\/strong> o <strong>o<\/strong>: salir de una funci\u00f3n y volver a la sentencia que la llama<\/li>\n<li><strong>pause<\/strong>: pausa la ejecuci\u00f3n del c\u00f3digo<\/li>\n<li><strong>watch(&#8216;myvar&#8217;)<\/strong>: vigilar una variable<\/li>\n<li><strong>setBreakPoint()<\/strong> o <strong>sb()<\/strong>: establece un punto de interrupci\u00f3n<\/li>\n<li><strong>restart<\/strong>: reiniciar el script<\/li>\n<li><strong>.exit<\/strong> o <strong>Ctrl | Cmd + D<\/strong>: salir del depurador<\/li>\n<\/ul>\n<p>Hay que reconocer que esta opci\u00f3n de depuraci\u00f3n requiere mucho tiempo y es poco manejable. Util\u00edzala s\u00f3lo cuando no haya otra opci\u00f3n, como cuando est\u00e9s ejecutando c\u00f3digo en un servidor remoto y no puedas conectarte desde otro lugar o instalar software adicional.<\/p>\n<h2>Utiliza el navegador Chrome para depurar el c\u00f3digo Node.js<\/h2>\n<p>La opci\u00f3n de inspecci\u00f3n de Node.js utilizada anteriormente inicia un servidor Web Socket que mira al puerto localhost 9229. Tambi\u00e9n inicia un cliente de depuraci\u00f3n basado en texto, pero es posible utilizar clientes gr\u00e1ficos, como <a href=\"https:\/\/kinsta.com\/es\/blog\/inspeccion-elementos\/\">el integrado en Google Chrome y en navegadores basados en Chrome<\/a> como Chromium, Edge, Opera, Vivaldi y <a href=\"https:\/\/kinsta.com\/es\/blog\/revision-brave-browser\/\">Brave<\/a>.<\/p>\n<p>Para depurar una aplicaci\u00f3n web t\u00edpica, in\u00edciala con la opci\u00f3n &#8211;inspect para activar el servidor Web Socket del depurador V8:<\/p>\n<pre><code class=\"language-js\">node --inspect index.js<\/code><\/pre>\n<p>Nota:<\/p>\n<ul>\n<li>se supone que index.js es el script de entrada de la aplicaci\u00f3n.<\/li>\n<li>Aseg\u00farate de utilizar <code>--inspect<\/code> con doble gui\u00f3n para garantizar que no inicias el cliente del depurador basado en texto.<\/li>\n<li>Puedes utilizar <a href=\"https:\/\/nodemon.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">nodemon<\/a> en lugar de node si quieres reiniciar autom\u00e1ticamente la aplicaci\u00f3n cuando se modifique un archivo.<\/li>\n<\/ul>\n<p>Por defecto, el depurador s\u00f3lo acepta conexiones entrantes desde la m\u00e1quina local. Si est\u00e1s ejecutando la aplicaci\u00f3n en otro dispositivo, m\u00e1quina virtual o contenedor Docker, utiliza:<\/p>\n<pre><code class=\"language-js\">node --inspect=0.0.0.0:9229 index.js<\/code><\/pre>\n<figure id=\"attachment_115105\" aria-describedby=\"caption-attachment-115105\" style=\"width: 907px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115105\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/node-inspect.png\" alt=\"node inspect\" width=\"907\" height=\"339\"><figcaption id=\"caption-attachment-115105\" class=\"wp-caption-text\">opci\u00f3n de inspecci\u00f3n del nodo.<\/figcaption><\/figure>\n<p>Tambi\u00e9n puedes utilizar <code>--inspect-brk<\/code> en lugar de <code>--inspect<\/code> para detener el procesamiento (establecer un punto de interrupci\u00f3n) en la primera l\u00ednea y as\u00ed poder recorrer el c\u00f3digo desde el principio.<\/p>\n<p>Abre un navegador basado en Chrome e introduce <code>chrome:\/\/inspect<\/code> en la barra de direcciones para ver los dispositivos locales y en red:<\/p>\n<figure id=\"attachment_115106\" aria-describedby=\"caption-attachment-115106\" style=\"width: 911px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115106\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-inspect.png\" alt=\"Chrome inspect tool\" width=\"911\" height=\"409\"><figcaption id=\"caption-attachment-115106\" class=\"wp-caption-text\">Herramienta de inspecci\u00f3n de Chrome.<\/figcaption><\/figure>\n<p>Si tu aplicaci\u00f3n Node.js no aparece como <strong>Objetivo Remoto<\/strong>, tampoco:<\/p>\n<ul>\n<li>Haz clic en Abrir DevTools dedicado para Node y elige la direcci\u00f3n y el puerto, o<\/li>\n<li>Marca la opci\u00f3n <strong>Discover network targets<\/strong>, haz clic en <strong>Configure<\/strong>, y luego a\u00f1ade la direcci\u00f3n IP y el puerto del dispositivo donde se est\u00e1 ejecutando.<\/li>\n<\/ul>\n<p>Haz clic en el enlace de <strong>Inspect<\/strong>\u00a0del objetivo para lanzar el cliente de depuraci\u00f3n DevTools. Esto deber\u00eda ser familiar para cualquiera que haya utilizado DevTools para la depuraci\u00f3n de c\u00f3digo del lado del cliente:<\/p>\n<figure id=\"attachment_115107\" aria-describedby=\"caption-attachment-115107\" style=\"width: 920px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115107\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-devtools.png\" alt=\"Chrome DevTools\" width=\"920\" height=\"550\"><figcaption id=\"caption-attachment-115107\" class=\"wp-caption-text\">Chrome DevTools.<\/figcaption><\/figure>\n<p>Cambia al panel de <strong>Sources<\/strong>. Puedes abrir cualquier archivo pulsando Cmd | Ctrl + P e introduciendo su nombre (como index.js).<\/p>\n<p>Sin embargo, es m\u00e1s f\u00e1cil a\u00f1adir la carpeta de tu proyecto al espacio de trabajo. Esto te permite cargar, editar y guardar archivos directamente desde DevTools (si crees que es una buena idea es otra cuesti\u00f3n)<\/p>\n<ol>\n<li>Haz clic en <strong>+ A\u00f1adir carpeta al espacio de trabajo<\/strong><\/li>\n<li>Selecciona la ubicaci\u00f3n de tu proyecto Node.js<\/li>\n<li>Pulsa <strong>Aceptar <\/strong>para permitir los cambios en los archivos<\/li>\n<\/ol>\n<p>Ahora puedes cargar archivos desde el \u00e1rbol de directorios de la izquierda:<\/p>\n<figure id=\"attachment_115113\" aria-describedby=\"caption-attachment-115113\" style=\"width: 1167px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115113\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-sources-2.png\" alt=\"Chrome DevTools Sources panel\" width=\"1167\" height=\"843\"><figcaption id=\"caption-attachment-115113\" class=\"wp-caption-text\">Panel de Sources de DevTools de Chrome.<\/figcaption><\/figure>\n<p>Haz clic en cualquier n\u00famero de l\u00ednea para establecer un punto de interrupci\u00f3n indicado por un marcador azul.<\/p>\n<p>La depuraci\u00f3n se basa en los <i>puntos<\/i> de interrupci\u00f3n. \u00c9stos especifican d\u00f3nde el depurador debe detener la ejecuci\u00f3n del programa y mostrar el estado actual del mismo (variables, pila de llamadas, etc.)<\/p>\n<p>Puedes definir cualquier n\u00famero de puntos de interrupci\u00f3n en la interfaz de usuario. Otra opci\u00f3n es colocar una sentencia debugger; en tu c\u00f3digo, que se detiene cuando se conecta un depurador.<\/p>\n<p>Carga y utiliza tu aplicaci\u00f3n web para llegar a la sentencia en la que se ha establecido un punto de interrupci\u00f3n. En este ejemplo, <a href=\"http:\/\/localhost:3000\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/localhost:3000\/<\/a> se abre en cualquier navegador, y DevTools detendr\u00e1 la ejecuci\u00f3n en la l\u00ednea 44:<\/p>\n<figure id=\"attachment_115114\" aria-describedby=\"caption-attachment-115114\" style=\"width: 1167px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115114\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-breakpoint.png\" alt=\"Chrome breakpoint\" width=\"1167\" height=\"843\"><figcaption id=\"caption-attachment-115114\" class=\"wp-caption-text\">Punto de interrupci\u00f3n de Chrome.<\/figcaption><\/figure>\n<p>El panel de la derecha muestra:<\/p>\n<ul>\n<li>Una fila de iconos de acci\u00f3n (ver abajo).<\/li>\n<li>Un panel de <strong>Watch<\/strong>\u00a0te permite controlar las variables haciendo clic en el icono <strong>+<\/strong> e introduciendo sus nombres.<\/li>\n<li>Un panel <strong>Breakpoints<\/strong>\u00a0muestra una lista de todos los puntos de ruptura y permite activarlos o desactivarlos.<\/li>\n<li>El panel <strong>Scope<\/strong>\u00a0muestra el estado de todas las variables locales, de m\u00f3dulo y globales. Este panel es el que inspeccionar\u00e1s m\u00e1s a menudo.<\/li>\n<li>Un panel de <strong>Call Stack<\/strong>\u00a0muestra la jerarqu\u00eda de funciones llamadas para llegar a este punto.<\/li>\n<\/ul>\n<p>Una fila de iconos de acci\u00f3n se muestra por encima de <strong>Paused on breakpoint<\/strong>:<\/p>\n<figure id=\"attachment_115115\" aria-describedby=\"caption-attachment-115115\" style=\"width: 625px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115115\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-breakpoint-icons.png\" alt=\"Chrome breakpoint icons\" width=\"625\" height=\"222\"><figcaption id=\"caption-attachment-115115\" class=\"wp-caption-text\">Iconos de puntos de interrupci\u00f3n de Chrome.<\/figcaption><\/figure>\n<p>De izquierda a derecha, realizan las siguientes acciones:<\/p>\n<ul>\n<li><strong>resume execution<\/strong>: Continuar el proceso hasta el siguiente punto de interrupci\u00f3n<\/li>\n<li><strong>step over<\/strong>: Ejecuta el siguiente comando pero mantente dentro del bloque de c\u00f3digo actual &#8211; no saltes a ninguna funci\u00f3n a la que llame<\/li>\n<li><strong>step into<\/strong>: Ejecuta el siguiente comando y salta a cualquier funci\u00f3n si es necesario<\/li>\n<li><strong>step out<\/strong>: Contin\u00faa el proceso hasta el final de la funci\u00f3n y vuelve al comando que la llama<\/li>\n<li><strong>step<\/strong>: Similar a <strong>step<\/strong> <strong>into<\/strong>, excepto que no saltar\u00e1 a las funciones as\u00edncronas<\/li>\n<li><strong>deactivate<\/strong> todos los puntos de interrupci\u00f3n<\/li>\n<li><strong>pause on exceptions<\/strong>: Detener el procesamiento cuando se produce un error<\/li>\n<\/ul>\n<h2>Puntos de interrupci\u00f3n condicionales<\/h2>\n<p>A veces es necesario ejercer un poco m\u00e1s de control sobre los puntos de interrupci\u00f3n. Imagina que tienes un bucle que ha completado 1.000 iteraciones, pero s\u00f3lo te interesa el estado de la \u00faltima:<\/p>\n<pre><code class=\"language-js\">\nfor (let i = 0; i &lt; 1000; i++) {\n  \/\/ set breakpoint here\n}\n<\/code><\/pre>\n<p>En lugar de hacer clic en <strong>reanudar la ejecuci\u00f3n<\/strong> 999 veces, puedes hacer clic con el bot\u00f3n derecho en la l\u00ednea, elegir <strong>Add conditional breakpoint<\/strong>\u00a0e introducir una condici\u00f3n como <code>i = 999<\/code>:<\/p>\n<figure id=\"attachment_115116\" aria-describedby=\"caption-attachment-115116\" style=\"width: 979px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115116\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-breakpoint-conditional.png\" alt=\"Chrome conditional breakpoint\" width=\"979\" height=\"113\"><figcaption id=\"caption-attachment-115116\" class=\"wp-caption-text\">Punto de interrupci\u00f3n condicional del cromo.<\/figcaption><\/figure>\n<p>Chrome muestra los puntos de interrupci\u00f3n condicionales en amarillo en lugar de azul. En este caso, el punto de interrupci\u00f3n s\u00f3lo se activa en la \u00faltima iteraci\u00f3n del bucle.<\/p>\n<h2>Puntos de registro<\/h2>\n<p>Los puntos de registro implementan efectivamente console.log() sin ning\u00fan c\u00f3digo Una expresi\u00f3n puede salir cuando el c\u00f3digo ejecuta cualquier l\u00ednea, pero no detiene el proceso, a diferencia de un punto de interrupci\u00f3n.<\/p>\n<p>Para a\u00f1adir un punto de registro, haz clic con el bot\u00f3n derecho del rat\u00f3n en cualquier l\u00ednea, elige <strong>A\u00f1adir<\/strong> <strong>log point<\/strong> e introduce una expresi\u00f3n, por ejemplo <code>'loop counter i', i<\/code>:<\/p>\n<figure id=\"attachment_115117\" aria-describedby=\"caption-attachment-115117\" style=\"width: 977px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115117\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-logpoint.png\" alt=\"Chrome logpoint\" width=\"977\" height=\"111\"><figcaption id=\"caption-attachment-115117\" class=\"wp-caption-text\">Punto de registro de Chrome.<\/figcaption><\/figure>\n<p>En el ejemplo anterior, la consola de DevTools muestra <code>loop counter i: 0<\/code> a <code>loop counter i: 999<\/code>.<\/p>\n<h2>Usa VS Code para depurar aplicaciones Node.js<\/h2>\n<p><a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">VS Code<\/a>, o Visual Studio Code, es un <a href=\"https:\/\/kinsta.com\/es\/blog\/mejores-editores-texto\/\">editor de c\u00f3digo<\/a> gratuito de Microsoft que se ha hecho popular entre <a href=\"https:\/\/kinsta.com\/es\/blog\/como-convertirse-desarrollador-web\/\">los desarrolladores web<\/a>. La aplicaci\u00f3n est\u00e1 disponible para Windows, macOS y Linux, y est\u00e1 desarrollada con tecnolog\u00edas web en el <a href=\"https:\/\/www.electronjs.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">marco de Electron<\/a>.<\/p>\n<p>VS Code es compatible con Node.js y tiene un cliente de depuraci\u00f3n integrado. La mayor\u00eda de las aplicaciones pueden ser depuradas sin ninguna configuraci\u00f3n; el editor iniciar\u00e1 autom\u00e1ticamente el servidor y el cliente de depuraci\u00f3n.<\/p>\n<p>Abre el archivo inicial (como index.js), activa el panel <strong>Run and Debug<\/strong>, haz clic en el bot\u00f3n <strong>Run and Debug<\/strong>\u00a0y elige el entorno <strong>Node.js<\/strong>. Haz clic en cualquier l\u00ednea para activar un punto de interrupci\u00f3n que se muestra como un icono de c\u00edrculo rojo. A continuaci\u00f3n, abre la aplicaci\u00f3n en un navegador como antes &#8211; VS Code detiene la ejecuci\u00f3n cuando se alcanza el punto de interrupci\u00f3n:<\/p>\n<figure id=\"attachment_115119\" aria-describedby=\"caption-attachment-115119\" style=\"width: 1245px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115119\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/vscode-breakpoint.png\" alt=\"VS Code breakpoint\" width=\"1245\" height=\"881\"><figcaption id=\"caption-attachment-115119\" class=\"wp-caption-text\">Punto de ruptura de VS Code.<\/figcaption><\/figure>\n<p>Los paneles <strong>Variables, Watch, Call Stack y Breakpoints<\/strong>\u00a0son similares a los que se muestran en <a href=\"https:\/\/kinsta.com\/es\/blog\/inspeccion-elementos\/\" target=\"_blank\" rel=\"noopener noreferrer\">Chrome DevTools<\/a>. El panel <strong>Loaded <\/strong><strong>Scripts<\/strong>\u00a0muestra los scripts que se han cargado, aunque muchos son internos de Node.js.<\/p>\n<p>La barra de herramientas de iconos de acci\u00f3n te permite<\/p>\n<ul>\n<li><strong>resume execution<\/strong>: Contin\u00faa el procesamiento hasta el siguiente punto de interrupci\u00f3n<\/li>\n<li><strong>step over<\/strong>: Ejecuta el siguiente comando pero permanece dentro de la funci\u00f3n actual &#8211; no saltes a ninguna funci\u00f3n a la que llame<\/li>\n<li><strong>step into<\/strong>: Ejecuta el siguiente comando y salta a cualquier funci\u00f3n a la que llame<\/li>\n<li><strong>step out<\/strong>: Continuar el proceso hasta el final de la funci\u00f3n y volver al comando que llama<\/li>\n<li><strong>restart <\/strong>la aplicaci\u00f3n y el depurador<\/li>\n<li><strong>stop <\/strong>la aplicaci\u00f3n y el depurador<\/li>\n<\/ul>\n<p>Al igual que las DevTools de Chrome, puedes hacer clic con el bot\u00f3n derecho en cualquier l\u00ednea para a\u00f1adir puntos de <strong>Conditional breakpoints y Log points.<\/strong><\/p>\n<p>Para m\u00e1s informaci\u00f3n, consulta <a href=\"https:\/\/code.visualstudio.com\/docs\/introvideos\/debugging\" target=\"_blank\" rel=\"noopener noreferrer\">Depuraci\u00f3n en Visual Studio<\/a> Code.<\/p>\n<h2>Configuraci\u00f3n de depuraci\u00f3n avanzada de VS Code<\/h2>\n<p>Puede ser necesaria una configuraci\u00f3n adicional de VS Code si quieres depurar el c\u00f3digo en otro dispositivo, en una m\u00e1quina virtual, o si necesitas utilizar opciones de lanzamiento alternativas como nodemon.<\/p>\n<p>VS Code almacena las configuraciones de depuraci\u00f3n en un archivo launch.json dentro de un directorio <code>.vscode<\/code> en tu proyecto. Abre el panel <strong>Run and Debug<\/strong>, haz clic en <strong>create a launch.json file<\/strong>\u00a0y elige el entorno <strong>Node.js<\/strong> para generar este archivo. Se proporciona un ejemplo de configuraci\u00f3n:<\/p>\n<figure id=\"attachment_115120\" aria-describedby=\"caption-attachment-115120\" style=\"width: 1245px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115120\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/vscode-launchjson.png\" alt=\"VS Code debugger configuration\" width=\"1245\" height=\"881\"><figcaption id=\"caption-attachment-115120\" class=\"wp-caption-text\">Configuraci\u00f3n del depurador de VS Code.<\/figcaption><\/figure>\n<p>Se puede definir cualquier n\u00famero de ajustes de configuraci\u00f3n como objetos en la matriz <code>\"configurations\"<\/code>. Haz clic en <strong>Add Configuration<\/strong>&#8230; y selecciona una opci\u00f3n adecuada.<\/p>\n<p>Una configuraci\u00f3n individual de Node.js puede<\/p>\n<ol>\n<li>Lanzar un proceso por s\u00ed mismo, o<\/li>\n<li>Adjuntar a un servidor de depuraci\u00f3n Web Socket, quiz\u00e1s ejecutado en una m\u00e1quina remota o en un contenedor Docker.<\/li>\n<\/ol>\n<p>Por ejemplo, para definir una configuraci\u00f3n de nodemon, selecciona <strong>Node.js: Nodemon Setup<\/strong>\u00a0y cambia el script de entrada del \u00abprograma\u00bb si es necesario:<\/p>\n<pre><code class=\"language-js\">{\n  \/\/ custom configuration\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"console\": \"integratedTerminal\",\n      \"internalConsoleOptions\": \"neverOpen\",\n      \"name\": \"nodemon\",\n      \"program\": \"${workspaceFolder}\/index.js\",\n      \"request\": \"launch\",\n      \"restart\": true,\n      \"runtimeExecutable\": \"nodemon\",\n      \"skipFiles\": [\n        \"&lt;node_internals&gt;\/**\"\n      ],\n      \"type\": \"pwa-node\"\n    }\n  ]\n}\n<\/code><\/pre>\n<p>Guarda el archivo <code>launch.json<\/code> y <strong>nodemon <\/strong>(el \u00abnombre\u00bb de la configuraci\u00f3n) aparecer\u00e1 en la lista desplegable de la parte superior del panel de <strong>Run and Debug<\/strong>. Haz clic en el icono verde de ejecuci\u00f3n para empezar a utilizar esa configuraci\u00f3n y lanzar la aplicaci\u00f3n utilizando nodemon:<\/p>\n<figure id=\"attachment_115121\" aria-describedby=\"caption-attachment-115121\" style=\"width: 1245px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115121\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/vscode-nodemon.png\" alt=\"VS Code debugging with nodemon\" width=\"1245\" height=\"876\"><figcaption id=\"caption-attachment-115121\" class=\"wp-caption-text\">Depuraci\u00f3n de VS Code con nodemon.<\/figcaption><\/figure>\n<p>Como antes, puedes a\u00f1adir puntos de ruptura, puntos de ruptura condicionales y puntos de registro. La principal diferencia es que nodemon reiniciar\u00e1 autom\u00e1ticamente tu servidor cuando se modifique un archivo.<\/p>\n<p>Para m\u00e1s informaci\u00f3n, consulta las <a href=\"https:\/\/code.visualstudio.com\/docs\/editor\/debugging#_launch-configurations\" target=\"_blank\" rel=\"noopener noreferrer\">configuraciones de lanzamiento de VS Code<\/a>.<\/p>\n<p>Las siguientes extensiones de VS Code tambi\u00e9n pueden ayudarte a depurar c\u00f3digo alojado en entornos de servidores remotos o aislados:<\/p>\n<ul>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-vscode-remote.remote-containers\" target=\"_blank\" rel=\"noopener noreferrer\">Remote &#8211; Containers<\/a>: Con\u00e9ctate a aplicaciones que se ejecutan en contenedores Docker<\/li>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-vscode-remote.remote-ssh\" target=\"_blank\" rel=\"noopener noreferrer\">Remote &#8211; SSH<\/a>: Con\u00e9ctate a aplicaciones que se ejecutan en un servidor remoto<\/li>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-vscode-remote.remote-wsl\" target=\"_blank\" rel=\"noopener noreferrer\">Remote &#8211; WSL<\/a>: Conecta con aplicaciones que se ejecutan en el Subsistema de Windows para Linux (WSL).<\/li>\n<\/ul>\n<h2>Otras opciones de depuraci\u00f3n de Node.js<\/h2>\n<p>La <a href=\"https:\/\/nodejs.org\/en\/docs\/guides\/debugging-getting-started\/\" target=\"_blank\" rel=\"noopener noreferrer\">Gu\u00eda de depuraci\u00f3n de Node.js<\/a> ofrece consejos para una serie de editores de texto e IDEs, como Visual Studio, JetBrains WebStorm, Gitpod y Eclipse. Atom ofrece una <a href=\"https:\/\/atom.io\/packages\/node-debug\" target=\"_blank\" rel=\"noopener noreferrer\">extensi\u00f3n node-debug<\/a>, que integra el depurador DevTools de Chrome en el editor.<\/p>\n<p>Una vez que tu aplicaci\u00f3n est\u00e9 en funcionamiento, puedes considerar el uso de servicios comerciales de depuraci\u00f3n como <a href=\"https:\/\/logrocket.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">LogRocket<\/a> y <a href=\"https:\/\/sentry.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Sentry.io<\/a>, que pueden grabar y reproducir los errores del cliente y del servidor encontrados por usuarios reales.<\/p>\n\n<h2>Resumen<\/h2>\n<p>Hist\u00f3ricamente, la <a href=\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/\">depuraci\u00f3n de JavaScript<\/a> ha sido dif\u00edcil, pero ha habido grandes mejoras en la \u00faltima d\u00e9cada. Las opciones son tan buenas -si no <i>mejores-<\/i> que las que se ofrecen para otros lenguajes.<\/p>\n<p>Utiliza cualquier herramienta que sea pr\u00e1ctica para localizar un problema. No hay nada malo en usar console.log() para la b\u00fasqueda r\u00e1pida de errores, pero Chrome DevTools o VS Code pueden ser preferibles para problemas m\u00e1s complejos. Las herramientas pueden ayudarte a crear un c\u00f3digo m\u00e1s robusto, y pasar\u00e1s menos tiempo arreglando fallos.<\/p>\n<p><em>\u00bfQu\u00e9 pr\u00e1ctica de depuraci\u00f3n de Node.js utilizas t\u00fa? \u00a1Comp\u00e1rtela en la secci\u00f3n de comentarios m\u00e1s abajo!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Node.js es un JavaScript runtime basado en el mismo motor V8 utilizado en el navegador Chrome de Google. Se suele utilizar para crear aplicaciones multiplataforma del &#8230;<\/p>\n","protected":false},"author":188,"featured_media":49502,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[399,414],"topic":[1296,1311],"class_list":["post-49501","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-debugging","tag-webdev","topic-frameworks-javascript","topic-node-js"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas<\/title>\n<meta name=\"description\" content=\"Este tutorial presenta diversas herramientas para depurar aplicaciones de nodos y encontrar sus causas de origen. Profundiza y aprende desde los fundamentos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/node-debug\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas\" \/>\n<meta property=\"og:description\" content=\"Este tutorial presenta diversas herramientas para depurar aplicaciones de nodos y encontrar sus causas de origen. Profundiza y aprende desde los fundamentos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/node-debug\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-17T08:58:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-31T13:40:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Craig Buckler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Este tutorial presenta diversas herramientas para depurar aplicaciones de nodos y encontrar sus causas de origen. Profundiza y aprende desde los fundamentos.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@craigbuckler\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Craig Buckler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/\"},\"author\":{\"name\":\"Craig Buckler\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/715d986404b06691ab3014e06596908e\"},\"headline\":\"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas\",\"datePublished\":\"2022-03-17T08:58:16+00:00\",\"dateModified\":\"2025-01-31T13:40:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/\"},\"wordCount\":3747,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg\",\"keywords\":[\"debugging\",\"webdev\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/node-debug\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/\",\"name\":\"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg\",\"datePublished\":\"2022-03-17T08:58:16+00:00\",\"dateModified\":\"2025-01-31T13:40:59+00:00\",\"description\":\"Este tutorial presenta diversas herramientas para depurar aplicaciones de nodos y encontrar sus causas de origen. Profundiza y aprende desde los fundamentos.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/node-debug\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg\",\"width\":1460,\"height\":730,\"caption\":\"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/node-debug\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/node-js\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/715d986404b06691ab3014e06596908e\",\"name\":\"Craig Buckler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"caption\":\"Craig Buckler\"},\"description\":\"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.\",\"sameAs\":[\"https:\/\/craigbuckler.com\/\",\"https:\/\/www.linkedin.com\/in\/craigbuckler\",\"https:\/\/x.com\/craigbuckler\",\"https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/craigbuckler\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas","description":"Este tutorial presenta diversas herramientas para depurar aplicaciones de nodos y encontrar sus causas de origen. Profundiza y aprende desde los fundamentos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/node-debug\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas","og_description":"Este tutorial presenta diversas herramientas para depurar aplicaciones de nodos y encontrar sus causas de origen. Profundiza y aprende desde los fundamentos.","og_url":"https:\/\/kinsta.com\/es\/blog\/node-debug\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2022-03-17T08:58:16+00:00","article_modified_time":"2025-01-31T13:40:59+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg","type":"image\/jpeg"}],"author":"Craig Buckler","twitter_card":"summary_large_image","twitter_description":"Este tutorial presenta diversas herramientas para depurar aplicaciones de nodos y encontrar sus causas de origen. Profundiza y aprende desde los fundamentos.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg","twitter_creator":"@craigbuckler","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Craig Buckler","Tiempo de lectura":"20 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/"},"author":{"name":"Craig Buckler","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/715d986404b06691ab3014e06596908e"},"headline":"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas","datePublished":"2022-03-17T08:58:16+00:00","dateModified":"2025-01-31T13:40:59+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/"},"wordCount":3747,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg","keywords":["debugging","webdev"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/node-debug\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/","url":"https:\/\/kinsta.com\/es\/blog\/node-debug\/","name":"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg","datePublished":"2022-03-17T08:58:16+00:00","dateModified":"2025-01-31T13:40:59+00:00","description":"Este tutorial presenta diversas herramientas para depurar aplicaciones de nodos y encontrar sus causas de origen. Profundiza y aprende desde los fundamentos.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/node-debug\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/03\/node-debug.jpg","width":1460,"height":730,"caption":"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/node-debug\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Node.js","item":"https:\/\/kinsta.com\/es\/secciones\/node-js\/"},{"@type":"ListItem","position":3,"name":"C\u00f3mo Depurar el C\u00f3digo Node.js Utilizando Diversas Herramientas"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/715d986404b06691ab3014e06596908e","name":"Craig Buckler","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","caption":"Craig Buckler"},"description":"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.","sameAs":["https:\/\/craigbuckler.com\/","https:\/\/www.linkedin.com\/in\/craigbuckler","https:\/\/x.com\/craigbuckler","https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/craigbuckler\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/49501","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/188"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=49501"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/49501\/revisions"}],"predecessor-version":[{"id":56683,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/49501\/revisions\/56683"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/49501\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/49501\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/49501\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/49501\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/49501\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/49501\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/49501\/translations\/nl"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/49501\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/49502"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=49501"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=49501"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=49501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}