martes, 17 de enero de 2012

Depurar node.js con Google Chrome (o Webkit)

Chrome, el navegador de Google, tiene una fantástica herramienta de depuración para aplicaciones web. Esta herramienta es genial para ayudar a evaluar que puede estar pasando en el código javascript del navegador (para arrancarlo el acceso rápido es Ctrl+Mayús+I en Windows y ⌥⌘I en Mac)

Dado que nodejs utiliza el mismo motor de javascript V8 que Chrome, la conclusión lógica es intentar utilizar esta herramienta para depurar aplicaciones nodejs, ¿no? Bien, pues resulta que es posible y sencillísimo.

Nota: me gusta desarrollar con TDD, es decir, en general no me gusta utilizar el depurador para desarrollar. Si se puede evitar, mejor que mejor. Sin embargo, como verás más abajo, con el depurador puedes inspeccionar todas la librerías que utiliza tu aplicación nodejs, lo cual considero treméndamente interesante para entender que pasa más allá de tu código.

Veamos cómo:

1. Instalamos node-inspector
Node Inspector (npm: node-inspector) es un interfaz de depuración para nodejs para poder utilizar el inspector de Chrome.
Como lo utilizaremos para depurar cualquier aplicación de nodejs, lo instalamos de manera global:
npm install -g node-inspector

Para arrancar node-inspector y dejarlo en segundo plano ejecutamos:
node-inspector &

En la consola veremos algo como:
info  - socket.io started
visit http://0.0.0.0:8080/debug?port=5858 to start debugging

Sobre windows: para arrancar node-inspector tuve que poner la ruta completa y lanzarlo directamente con node. Hice una instalación en c:\node-inspector, con lo que quedó así:
node C:\node-inspector\node_modules\node-inspector\bin\inspector.js



2. Montemos una aplicación de ejemplo para depurar.
Para el ejemplo montaremos una aplicación sencillota con express.
npm install express

Creamos un servidor "hola mundo" en el fichero server.js:
var express = require('express'),
    app = express.createServer();
app.get('/', function(req, res){
    res.send('Hello World');
});
app.listen(3000);

3. Y a depurar...
Arrancamos el servidor en modo depuración:
node --debug server.js

Con Google Chrome accedemos a http://0.0.0.0:8080/debug?port=5858 ( http://127.0.0.1:8080/debug?port=5858 ).

Y veremos la consola:



Desde aquí podemos poner puntos de interrupción, evaluar expresiones, interaccionar con la consola, ver el stack de llamadas, etc.


Y podemos inspeccionar todos los ficheros que utiliza node para realizar las tareas, con lo que conseguiremos hacer desaparecer la "automagia" de node y trabajar sobre seguro.

El listado de scripts desplegado:



Fragmento de http.js:



Inspección de objetos (esta captura la saco desde mac, que las anteriores eran en windows :) ):





2 comentarios:

  1. Un problema que puede pasar en Windows es que si tienes el puerto 8080 escuchado por otro servicio por, ejemplo ISS, saldrá un error: "error raised: Error: listen EACCES" para ello se debe arrancar poniendo en consola: "node-inspector --web-port=5000" (Donde 5000 el puerto que se desee)

    ResponderEliminar
    Respuestas
    1. De todas formas decir que ya no dan soporte según tengo entendido por este post, donde comentan alternativas: http://stackoverflow.com/questions/1911015/how-to-debug-node-js-applications/16512303#16512303

      Eliminar