Dies ist ein praktisches Tutorial zum Debuggen Ihrer in Node.js erstellten Anwendungen. Damit lernen Sie, diese Aufgabe vollständig und bestmöglich zu erledigen. Dieses Handbuch hilft Ihnen beim Debuggen Ihrer Node.js-Anwendungen und -Skripte. Lesen Sie weiter und erfahren Sie mehr.
Aktivieren Sie einen Inspektor
Beim Start mit dem Schalter --prüfen
Ein Node.js-Prozess wartet über WebSockets auf Diagnosebefehle, die standardmäßig vom Inspector-Protokoll auf dem Host und dem Port definiert werden 127.0.0.1:9229. Jedem Prozess wird außerdem eine eindeutige UUID zugewiesen (z. B.) 0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e).
Inspector-Clients müssen die Hostadresse, den Port und die UUID kennen und angeben, um eine Verbindung zur WebSocket-Schnittstelle herzustellen. Die vollständige URL ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e Dies hängt natürlich vom tatsächlichen Host und Port sowie von der richtigen UUID für die Instanz ab.
Der Inspektor enthält auch einen HTTP-Endpunkt zum Bereitstellen von Metadaten zum Debugger, einschließlich der WebSocket-URL, der UUID und der Chrome DevTools-URL. Rufen Sie diese Metadaten ab, indem Sie eine HTTP-Anfrage an senden http: // [Host: Port] / json / list. Dies gibt ein JSON-Objekt wie das folgende zurück; Verwenden Sie die Eigenschaft webSocketDebuggerUrl als URL, um eine direkte Verbindung zum Inspector herzustellen.
{"description": "node.js instance", "devtoolsFrontendUrl": "chrome-devtools: //devtools/bundled/inspector.html? experiment = true & v8only = true & ws = 127.0.0.1: 9229 / 0f2c936f-b1cd -4ac9-aab3 -f63b0f33d55e "," faviconUrl ":" https://nodejs.org/static/favicon.ico "," id ":" 0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e "," title ":" node "," type ":" node "," url ":" file: // "," webSocketDebuggerUrl ":" ws: //127.0.0.1: 9229 / 0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e "}
Sie können auch einen gestarteten Node.js-Prozess anweisen ohne –inspektion um Debug-Nachrichten abzuhören, indem Sie sie mit signalisieren SIGUSR1 (unter Linux und OS X). Ab Knoten 7 wird dadurch die Legacy-Debugging-API aktiviert. Auf Knoten 8 und höher wird der API-Inspektor aktiviert.
Sicherheit ist involviert
Da der Debugger vollen Zugriff auf die Laufzeit von Node.js hat, kann ein böswilliger Akteur, der eine Verbindung zu diesem Port herstellen kann, im Namen des Knotenprozesses beliebigen Code ausführen. Es ist wichtig, die Sicherheitsauswirkungen des Offenlegens des Debug-Ports in öffentlichen und privaten Netzwerken zu verstehen.
Das öffentliche Offenlegen des Debug-Ports ist nicht sicher
Wenn der Debugger an eine öffentliche IP-Adresse gebunden ist, oder 0.0.0.0, Jeder Client, der auf Ihre IP-Adresse zugreifen kann, kann ohne Einschränkungen eine Verbindung zum Debugger herstellen und beliebigen Code ausführen.
Standardmäßig ist node –inspect an 127.0.0.1 gebunden. Sie müssen explizit eine öffentliche IP-Adresse oder 0.0.0.0 usw. angeben, wenn Sie externe Verbindungen zum Debugger zulassen möchten. Dies kann Sie einer potenziell erheblichen Sicherheitsbedrohung aussetzen. Wir empfehlen, dass Sie geeignete Firewalls und Zugriffskontrollen sichern, um Sicherheitsrisiken zu vermeiden.
Lokale Anwendungen haben vollen Zugriff auf den Inspektor.
Auch wenn Sie den Inspector-Port an binden 127.0.0.1 (Standardeinstellung) Alle Anwendungen, die lokal auf Ihrem PC ausgeführt werden, haben uneingeschränkten Zugriff. Dies ist beabsichtigt, damit lokale Debugger bequem eine Verbindung herstellen können.
Browser, Websockets und Richtlinien mit demselben Ursprung.
In einem Webbrowser geöffnete Websites können WebSocket- und HTTP-Anforderungen unter dem Sicherheitsmodell des Browsers stellen. Eine anfängliche HTTP-Verbindung ist erforderlich, um eine eindeutige Debugger-Sitzungs-ID zu erhalten. Dieselbe Ursprungsrichtlinie verhindert, dass Websites diese HTTP-Verbindung herstellen.
Für zusätzliche Sicherheit gegen DNS-Rebinding-Angriffe überprüft Node.js, ob die 'Host'-Header für die Verbindung eine IP-Adresse oder localhost oder localhost6 genau angeben.
Mit diesen Sicherheitsrichtlinien können Sie keine Verbindung zu einem Remote-Debugging-Server herstellen, indem Sie den Hostnamen angeben. Sie können diese Einschränkung umgehen, indem Sie die IP-Adresse angeben oder ssh-Tunnel wie unten beschrieben verwenden.
Inspektor-Kunden
An den Node Inspector können verschiedene kommerzielle und Open Source-Tools angeschlossen werden. Hier einige grundlegende Informationen zu diesen Themen:
- Node-Inspect
- Von der Node.js Foundation unterstützter CLI-Debugger, der das Inspector-Protokoll verwendet.
- Eine Version ist in Node enthalten und kann mit dem Knoten inspect myscript.js verwendet werden.
- Die neueste Version kann auch eigenständig installiert werden (z. B. npm install -g node-inspect) und mit node-inspect myscript.js verwendet werden.
- Chrome DevTools 55+
- Option 1: Öffnen Sie chrome: // inspect in einem Chromium-basierten Browser. Klicken Sie auf die Schaltfläche Konfigurieren und stellen Sie sicher, dass der Zielhost und der Zielport aufgelistet sind.
- Option 2: Kopieren Sie devtoolsFrontendUrl aus der Ausgabe von / json / list (siehe oben) oder dem Hinweistext –inspect und fügen Sie ihn in Chrome ein.
- Option 3: Installieren Sie Chrome Extension NIM (Node Inspector Manager): https://chrome.google.com/webstore/detail/nim-node-inspector-manage/gnhhdgbaldcilmgcpfddgdbkhjohddkj
- Visual Studio Code 1.10+
- Klicken Sie im Debugging-Bereich auf das Einstellungssymbol, um .vscode / launch.json zu öffnen. Wählen Sie "Node.js" für die Erstkonfiguration.
- Visual Studio 2017
- Wählen Sie "Debug> Debugging starten" aus dem Menü oder drücken Sie F5.
- JetBrains WebStorm 2017.1+ und andere JetBrains-IDEs
- Erstellen Sie eine neue Node.js-Debug-Konfiguration und klicken Sie auf Debug. –Inspect wird standardmäßig für Node.js 7+ verwendet. So deaktivieren Sie js.debugger.node.use.inspect in der IDE-Registrierung.
- Chrome Remote-Schnittstelle
- Verfügt über eine Bibliothek zur Erleichterung der Verbindungen zu Inspector-Protokollendpunkten
Befehlszeilenoptionen
In der folgenden Tabelle sind die Auswirkungen verschiedener Laufzeitflags auf das Debuggen aufgeführt:
- -Prüfen:
- Aktivieren Sie den Inspektionsagenten
- Lauschen Sie der Standardadresse und dem Standardport (127.0.0.0.1: 9229).
- –Inspect = [Host: Port]:
- Aktivieren Sie den Inspektionsagenten
- An Hostname Adresse oder Host binden (Standard: 127.0.0.0.1)
- Port abhören (Standard: 9229)
- –Inspect-brk
- Aktivieren Sie den Inspektionsagenten
- Lauschen Sie der Standardadresse und dem Standardport (127.0.0.1:9229).
- Pause, bevor der Benutzercode startet
- –Inspect-brk =[Host: Port]
- Aktivieren Sie den Inspektionsagenten
- An Hostname Adresse oder Host binden (Standard: 127.0.0.0.1)
- Port abhören (Standard: 9229)
- Pause, bevor der Benutzercode startet
- Knoten inspizieren script.js
- Untergeordneten Prozess erzeugen, um das Benutzerskript unter dem Flag –inspect auszuführen. Verwenden Sie den Hauptprozess, um den CLI-Debugger auszuführen.
- node inspect –port = xxxx script.js
- Untergeordneten Prozess erzeugen, um das Benutzerskript unter dem Flag –inspect auszuführen. Verwenden Sie den Hauptprozess, um den CLI-Debugger auszuführen.
- Port abhören (Standard: 9229)
Aktivieren von Remote-Debugging-Szenarien
Ich empfehle, dass Sie den Debugger niemals dazu bringen, eine öffentliche IP-Adresse abzuhören. Wenn Sie Remote-Debugging-Verbindungen zulassen müssen, empfehle ich stattdessen die Verwendung von SSH-Tunneln. Das folgende Beispiel dient nur zur Veranschaulichung. Bitte haben Sie Verständnis für das Sicherheitsrisiko, den Remotezugriff auf einen privilegierten Dienst zuzulassen, bevor Sie fortfahren.
Angenommen, Sie führen Node.js auf einem Remotecomputer aus. remote.example.com, Sie möchten debuggen können. Auf diesem Computer sollten Sie den Knotenprozess so starten, dass der Inspektor nur localhost abhört (Standardeinstellung).
$-Knoten --inspect server.js [php] Jetzt können Sie auf Ihrem lokalen Computer, von dem aus Sie eine Debug-Client-Verbindung starten möchten, einen SSH-Tunnel konfigurieren: [PHP] $ SSH -L 9221: localhost: 9229 @ user_sample. remote.com
Dadurch wird eine SSH-Tunnelsitzung gestartet, in der eine Verbindung zu Port 9221 Ihres lokalen Computers an Port 9229 von remote.example.com weitergeleitet wird. Jetzt können Sie einen Debugger wie Chrome DevTools oder Visual Studio Code an localhost: 9221 anhängen, der debuggen kann, als ob die Anwendung Node.js lokal ausgeführt würde.