Debugging i Node.js

2015-09-02 23:35:47

När jag överväger att lära mig ett nytt programmeringsspråk så sätter jag numera stor vikt vid att det ska finnas heltäckande stöd för debugging och profilering av kod. I vissa språk har detta varit en självklarhet i femton år, men inom webbutvecklingen har det inte alltid varit lika självklart.

Node.JS är ett relativt ungt språk som växer i popularitet explosionsartat inom webbutvecklingen och detta var för mig en kärnfråga före jag började på. Jag har forskat lite i detta, och tänkte förmedla vidare vad jag kom fram till, se detta som en pragmatisk vägledning i blogg-format.

Node.JS har en inbyggd debugger i standardbiblioteket, men är inte särskilt användarvänlig, ett bättre alternativ är verktyget node-inspector som i första hand är tänkt att användas i kombination med webbläsaren Google Chrome. Förutsatt att man har NPM installerat och konfigurerat korrekt i sitt operativsystem så är det busenkelt att installera node-inspector. Jag poängterar detta eftersom det kan vara lite bökigt att få det att fungera under Windowsmiljö eftersom det krävs att man installerar Visual Studio och Python för att få med alla beroenden. För Linux och Mac användare fungerar detta out-of-the box utan extra trixande. 

Node Inspector installerar man med terminal kommandot npm install -g node-inspector

- notera '-g' parametern som står för global.

Efter att man installerat detta verktyg så startar man det genom kommandot  node-inspector

Som svar får man något i stil med:

> Node Inspector v0.12.2 Visit http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5858 to start debugging.

När man besöker serverns adress på port 8080 i sin Google Chrome webbläsare, så öppnas webbläsarens DevTools automatiskt i debug-läge.

När man nu då vill utvärdera / felsöka sina koder så lägger man antingen in breakpoint:s på de ställen i koden där man vill att debbuger:n ska pausa körningen, detta gör man genom att skriva debugger; var som helst i koden. Ett annat alternativ är att lägga in en "break-on-first-line" parameter när man kör sitt skript för att instruera debuggern att stanna vid första kod-raden.

För att köra sitt skript i debugger-läge så använder man --debug flaggan (i terminalen):

node --debug mitt_script.js

och break on first line flaggan är

node --debug-brk mitt_script.js

Nedan har jag ett kod-exempel för att testa debugging i praktiken. Eftersom node-inspector redan körs via terminalen, så öppnar jag ett nytt terminal-fönster där jag kör mitt skript. Koden i exemplet förväntas returnera texten "Anslutning upprättad" i webbläsaren (eller annan HTTP klient).

/*
** Enkelt debugging test med Node HTTP-server
** Mathias Renlund | mrenlund.com
** 5.9.2015 
*/

var http = require('http');
debugger;
http.createServer(function (req, res) {
	res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
	res.end('Anslutning upprättad.');
}).listen(80, '192.168.1.104');

När jag öppnar upp en ny flik i webbläsaren och besöker den IP adress och den port (standard HTTP-port 80 i mitt fall) som Node.js skriptet är instruerat att svara på, så reagerar debugger-fönstret, som pausat körningen vid den breakpoint jag angivit och härifrån kan jag då "steppa" genom koden rad för rad och hålla koll på objektens värden.

debugger

Hot-tip

Server-applikationer som i exemplet ovan tillåts inte använda samma port som någon annan service såsom t.ex. Apache. - Ett vanligt nybörjar-misstag är att man avbryter sitt server-skript med Ctrl + Z istället för Ctrl +C vilket bara pausar processens körning, men frigör inte porten i fråga, och nästa gång man försöker starta sitt skript så fungerar det inte p.g.a. porten är upptagen.

Leta upp processens id (PID) med kommandot 

netstat -antp och döda processen med

kill -KILL <PID>

Kommentarer

Är man van vid att debug:a JavaScript-kod på klient-sidan, så är detta inget nytt och har mer eller mindre samma upplägg som vilket IDE som helst. På tal om IDE så har WebStorm onekligen det bästa stödet idag vad gäller Node.Js överlag, och hanterar också debuggingen fristående utan inblanding av Chrome.