Eseguire il debug con il debugger predefinito di Node.js

Completato

Il debug è un'applicazione a più fasi che in genere segue questi passaggi:

  1. Identificare un bug nel programma.
  2. Individuare il punto del codice in cui si trova il bug.
  3. Analizzare il motivo per cui si verifica il bug.
  4. Correggere il bug.
  5. Verificare che la correzione funzioni.

Dopo avere identificato un errore nel programma Node.js, il primo problema da affrontare è trovare il punto nel codice in cui si trova l'errore. A tale scopo, uno dei modi più efficienti consiste nell'eseguire il codice in modo dettagliato per ottenere un'idea del punto in cui si verificano problemi.

Punti di interruzione

Eseguire tutto il codice un'istruzione alla volta può essere estremamente inefficiente se il programma contiene migliaia di righe di codice. In tal caso, è possibile usare un punto di interruzione. Tale elemento consente di interrompere la normale esecuzione del programma e sospenderla in corrispondenza di un determinato punto nel codice.

Usando i punti di interruzione è possibile eseguire il programma normalmente, fino a raggiungere la parte critica del codice in cui si sospetta si trovi l'errore. A quel punto, è possibile passare all'esecuzione un'istruzione alla volta.

Ci sono diversi modi per definire i punti di interruzione nel codice a seconda del debugger e dell'editor di codice.

Modalità di controllo di Node.js

Poiché un debugger ha accesso completo all'ambiente di esecuzione, un attore malintenzionato potrebbe usarlo anche per inserire codice arbitrario nell'applicazione Node.js. Per questo motivo, per impostazione predefinita Node.js non consente di eseguire il debug di un programma in esecuzione. Per consentire il debug, è necessario abilitare una modalità speciale, la modalità di controllo.

È necessario avviare l'applicazione con l'opzione --inspect per consentire a un client del debugger di collegarsi all'applicazione e assumere il controllo dell'esecuzione dell'applicazione.

Per impostazione predefinita, quando Node.js viene avviato con l'opzione , rimane in ascolto sull'host --inspect 127.0.0.1 sulla porta 9229. È anche possibile specificare un host e una porta personalizzati usando la sintassi --inspect=<HOST>:<PORT>.

Importante

Evitare di associare la porta del debugger Node.js a un indirizzo IP pubblico o a 0.0.0.0. In caso contrario, tutti i client che possono connettersi all'indirizzo IP potrebbero potenzialmente connettersi e controllare l'applicazione Node.js. In questo modo, un utente malintenzionato può eseguire codice arbitrario da remoto nell'ambiente di esecuzione. Ciò può causare una violazione della sicurezza potenzialmente grave.

In alternativa, è possibile usare l'opzione --inspect-brk. Questa opzione funziona allo stesso modo di --inspect, ma interrompe l'esecuzione del codice immediatamente prima del suo avvio. In questo modo è possibile collegare il debugger e dedicare il tempo necessario per impostare i punti di interruzione ed esaminare il codice per identificare la causa radice del problema. Usare questa --inspect-brk opzione quando è necessario eseguire il debug:

  • Una race condition.
  • Problema intermittente difficile da riprodurre.

Dopo l'avvio dell'applicazione con la modalità di controllo abilitata, è possibile usare tutti i client del debugger compatibili per connettersi al processo dell'applicazione.

Client del debugger

Per eseguire il debug dell'applicazione, è necessario usare un client del debugger. Un client del debugger è un programma che si connette all'applicazione Node.js e consente di controllarne l'esecuzione. Sono disponibili molti client del debugger, ma quelli più comuni sono:

  • Visual Studio Code: un client del debugger grafico incluso in Visual Studio Code. Usare questa opzione durante il debug durante lo sviluppo.
  • node-inspect: client del debugger della riga di comando fornito in bundle con Node.js. Usare questa opzione durante il debug nell'ambiente di produzione.

Debugger predefinito

È possibile usare node-inspect, client del debugger della riga di comando, incluso in Node.js, per eseguire il debug dell'applicazione Node.js. Si tratta di un debugger semplice che consente di impostare punti di interruzione ed eseguire il codice in modo dettagliato.

node inspect <YOUR_SCRIPT>.js

Il debugger node-inspect esegue Node.js con la modalità di controllo abilitata e viene avviato contemporaneamente al debugger interattivo integrato. L'esecuzione viene sospesa immediatamente prima dell'avvio del codice. Verrà visualizzato un prompt del debugger che indica che è stato avviato correttamente.

node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/ce3689fa-4433-41ee-9d5d-98b5bc5dfa27
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in myscript.js:1
> 1 const express = require('express');
  2
  3 const app = express();
debug>