Zuvor haben wir uns angesehen, wie Sie mit dem Debuggen eines einfachen Servers beginnen und wie Sie den Code im Debugger verschieben können. Heute werden wir uns zwei weniger herausragende Merkmale ansehen. Die erste ist die Möglichkeit, Variablen zu bearbeiten. Die zweite ist die Fähigkeit, eine Funktion wiederzugeben – um genau zu sein, einen Stapelrahmen neu zu starten – ohne den Debugger oder die Anwendung neu zu starten.
Diese Funktionen sind zwar nicht besonders intuitiv, aber sehr leistungsfähig und können eine Menge Zeit sparen. Sie können eine tief in der Aufrufliste vergrabene Funktion mit unterschiedlichen Eingaben ausprobieren, ohne eine möglicherweise lange und mühsame Reise neu zu beginnen.
Mal sehen, wie wir sie zusammen verwenden können, um verschiedene Szenarien in unserer üblichen kleinen Server-App auszuprobieren.
Einrichtung
Wir spielen mit dem üblichen Code-Snippet herum, kopieren Sie es und fügen Sie es in eine leere Datei ein, wenn es sich noch nicht auf Ihrem Computer befindet:
const http = require('http');
const url = require('url');
const hostname = '127.0.0.1';
const port = 3456;
const serverUrl = `http://${hostname}:${port}`
const getNameFromReq = (req) => {
const {name} = url.parse(req.url, true).query;
return name
}
const getGreeting = (name) => {
const greeting = `Hello, ${name}!`
return greeting
}
const server = http.createServer((req, res) => {
const name = getNameFromReq(req)
const greeting = getGreeting(name)
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end(`${greeting}\n`);
});
server.listen(port, hostname, () => {
console.log(`Server running at ${serverUrl}`);
});
Hallo, undefiniert!
Unser Spielzeugserver geht davon aus, dass es immer einen Abfrageparameter namens name
gibt in der Anfrage vorhanden. Wenn es fehlt, lautet die Antwort "Hello, undefined!":
> curl http://127.0.0.1:3456
Hello, undefined!
Lassen Sie uns den Debugger verwenden und sehen, wie unser getGreeting
Funktion verhält sich mit unterschiedlichem name
Parameter. Der Fix ist offensichtlich trivial, aber spielen wir mit, wir sind hier, um zu sehen, was der Debugger tun kann. 🤓
Lassen Sie uns einen Haltepunkt in Zeile 15 setzen und den Server ohne ein Argument für die Namensabfrage erreichen (z. B. curl http://127.0.0.1:3456
).
Sie sollten sehen, wie der Debugger startet und in Zeile 15 stoppt.
Wenn Sie sich nicht sicher sind, wie das geht, lesen Sie bitte Teil 1, die Grundlagen
Stellen Sie sicher, dass die Abschnitte „Variablen“ und „Aufrufliste“ in der Debug-Seitenleiste geöffnet sind. Wir konzentrieren uns auf die lokale Variable name
vorerst undefiniert:
Gehen wir über die nächste Zeile (F10
) und beobachten Sie den Rückgabewert von getGreeting
:
Wenn Sie einen schnellen Überblick über das Übersteigen, Einsteigen und Aussteigen benötigen, lesen Sie Teil 2, Navigieren mit Schritten
Ok, hier gibt es keine Überraschungen:Wenn die name
ist undefined
, lautet die Begrüßung Hello, undefined!
.
Zurückspulen
Lassen Sie uns diese Funktion erneut ausführen, diesmal mit einem anderen name
. Wir müssen keine weitere Anfrage abfeuern - wir können den letzten Stack-Frame neu starten:
Und wir sind wieder am Anfang der getGreeting
Funktion 👌
Versuchen wir nun, was passieren würde, wenn der Name null
wäre ? Wir können die lokale Variable zur Finanzierung bearbeiten:
Wir können versuchen, einen Stringwert zu setzen - achten Sie auf die Anführungszeichen um den Wert:
Sie können alles Lokale oder in der Closure definierte überschreiben, einschließlich Funktionen:
Denken Sie daran:Sobald Sie Funktionen überschreiben, müssen Sie den Prozess neu starten, um zur ursprünglichen Implementierung zurückzukehren.
Und das ist es:Sie können jetzt Funktionen im Debugger neu starten und lokale und Closure-Werte bearbeiten, einschließlich Strings und Funktionen. Warum spielen Sie nicht herum und sehen, was passiert, wenn Sie Funktionen weiter oben im Stack neu starten?
Viel Spaß beim Debuggen! 🥼