Abschnitt 1 · Lektion 4
Fehler lesen in Node
Eine Node-Fehlermeldung sieht auf den ersten Blick aus wie eine Wand aus Text. Sie hat aber immer denselben Aufbau, und wenn du den einmal kennst, brauchst du drei Sekunden statt drei Minuten.
Vier Teile, immer in derselben Reihenfolge
const preise = [19, 29, 39];
console.log(summe(preise)); Oben steht der Ort. Dateiname, Doppelpunkt, Zeilennummer. Darunter die Zeile selbst und ein Zeiger auf die Stelle. Das ist der Teil, den du zuerst liest, und in neun von zehn Fällen der einzige, den du brauchst.
Dann kommt die Art. ReferenceError, TypeError, SyntaxError, RangeError. Die Art sagt
dir, welche Sorte Missverständnis vorliegt, noch bevor du den Text daneben gelesen hast.
Dann der Text. summe is not defined ist so wörtlich gemeint, wie es dasteht.
Dann der Stacktrace, die Zeilen mit at. Er beschreibt den Weg dorthin: ganz oben die Stelle,
an der es geknallt hat, darunter die Aufrufe, die dorthin geführt haben.
Der Ort ist ein Knopf
Dateiname, Zeile und meistens noch die Spalte heißen zusammen die Fundstelle, im ersten Beispiel
also index.js:2:9. Sie steht unterstrichen da, und ein Klick darauf holt die Datei in den Editor,
springt auf die Zeile und färbt sie, bis du etwas änderst.
Das gilt für den Ort oben und für jede Zeile des Stacktrace, in der deine eigene Datei steht.
Die Zeilen aus node:internal bleiben Text: Dorthin führt kein Weg, und zu ändern ist dort ohnehin
nichts. Im dritten Beispiel siehst du beides auf einmal: Ganz oben steht node:internal, und deine
eigene Datei taucht erst in der neunten at-Zeile auf. Sie ist die einzige mit Unterstrich.
Warum die oberste Zeile selten hilft
Der Stacktrace wird von oben nach unten gelesen, und trotzdem ist die oberste Zeile fast nie die
interessante. Unter der ersten stehen meistens Einträge wie Module._compile und
Module._extensions, also Node selbst.
Such die erste Zeile, in der deine eigene Datei steht. Genau dort hast du etwas getan, das nicht aufging. Alles darüber ist der Maschinenraum, alles darunter die Vorgeschichte. Sie ist auch die erste, die eine anklickbare Fundstelle trägt, du erkennst sie also schon am Unterstrich.
Das gilt später auch für Fehler aus fremden Paketen. Wenn dein Server abstürzt und der Stacktrace mit
zwanzig Zeilen aus node_modules anfängt, ist die erste Zeile mit deinem Dateinamen die, an der du
anfängst.
Die drei Arten, die dir zuerst begegnen
Zwei davon kennst du aus dem Browser.
ReferenceError heißt: Diesen Namen gibt es nicht. Ein Tippfehler, eine vergessene Deklaration,
eine Funktion in einer anderen Datei, die du noch nicht geholt hast, oder eben document in Node.
TypeError heißt: Den Namen gibt es, aber er kann das nicht.
const kurs = { titel: "Node" };
console.log(kurs.titel.toUpperCase());
console.log(kurs.beschreibung.toUpperCase()); Die Zeile vor dem Absturz schreibt noch ihr NODE heraus, und das ist kein Zufall: Ein Absturz beendet
das Programm an genau der Stelle, an der er passiert, nicht vorher. Was schon ausgegeben wurde,
bleibt stehen, und das ist bei der Fehlersuche oft der beste Hinweis: Wie weit ist es gekommen?
Die dritte Art ist neu, sie gibt es im Browser gar nicht.
const rechnen = require("./rechnen");
console.log(rechnen); Cannot find module heißt: Node hat an den Stellen gesucht, an denen es sucht, und nichts
gefunden. Meist ist es ein falscher Pfad, ein vergessenes ./ oder ein Paket, das nicht installiert
ist. Abschnitt 2 zeigt genau, wo Node sucht, und danach liest sich diese Meldung von selbst.
Der Exit-Code
Zum Schluss die Angabe, die man leicht übersieht, weil man sie nicht sieht.
Wenn ein Fehler unbehandelt bis nach oben durchschlägt, beendet Node den Prozess mit Exit-Code 1. Läuft alles durch, ist es 0. Diese eine Zahl ist der Unterschied zwischen „hat geklappt” und „hat nicht geklappt”, und zwar für jedes andere Programm, das deins aufruft.
Genau daran erkennt eine Kommandozeile, ein Build-Skript oder ein Server, ob der Aufruf erfolgreich war, obwohl die Ausgabe für einen Menschen auf den ersten Blick nur Text ist. Deshalb wird er in fast jeder Aufgabe mitgeprüft.
Zu sehen bekommst du die Zahl hier allerdings nirgends. Im Terminal steht, was dein
Programm geschrieben hat, und bei einem unbehandelten Fehler der Stacktrace in Rot, mehr nicht. Das
ist keine Lücke, sondern die Gewohnheit einer Shell: Sie meldet den Erfolg nicht, sie kehrt zurück,
und nur der Fehlschlag ist eine Nachricht wert. Die Zahl prüft in fast jeder Aufgabe die Prüfliste
für dich. Und wenn du sie wirklich einmal sehen willst, hängst du sie im Terminal an deinen Befehl:
node index.js; echo $? schreibt dir die Zahl in die nächste Zeile.
Zum Mitnehmen
Die interessante Zeile im Stacktrace ist fast nie die oberste, sondern die erste, in der deine eigene Datei steht.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.