Node.js-Interviews drehen sich um den Event Loop, asynchrone Muster, Express oder NestJS und die Konsequenzen eines Single-Thread-Runtimes. Hier sind die häufigsten Fragen mit Musterantworten.
Zu jeder Frage gibt es eine Musterantwort, mit der du deine eigene vergleichen kannst.
1
Erkläre den Event Loop in Node.js. Welche Phasen hat er?
Antwort
Der Event Loop arbeitet wiederholt Warteschlangen abgeschlossener Operationen in Phasen ab: Timers für setTimeout und setInterval, Pending Callbacks, Poll für eingehendes I/O, Check für setImmediate und Close Callbacks. Zwischen jeder Phase leert Node die Microtask-Queue — zuerst process.nextTick, dann Promise-Callbacks. Deshalb blockiert eine lange synchrone Funktion jeden Request auf dem Server: Bis sie zurückkehrt, kann nichts anderes laufen.
2
Was ist der Unterschied zwischen process.nextTick() und setImmediate()?
Antwort
process.nextTick reiht einen Callback ein, der ausgeführt wird, bevor der Event Loop zur nächsten Phase weiterzieht, noch vor den Promise-Microtasks. setImmediate plant den Callback für die check-Phase der nächsten Iteration ein. nextTick läuft daher immer früher, und rekursive nextTick-Aufrufe können den Event Loop vollständig aushungern, weshalb setImmediate der sicherere Standard ist, um Arbeit zu verschieben.
3
Was ist ein Promise? Erkläre Promise.all im Vergleich zu Promise.allSettled.
Antwort
Ein Promise repräsentiert einen Wert, der später verfügbar sein wird, und ist entweder pending, fulfilled oder rejected. Promise.all löst auf, sobald alle Eingaben aufgelöst haben, lehnt aber sofort bei der ersten Ablehnung ab und verwirft dabei die übrigen Ergebnisse — genau dann problematisch, wenn du eigentlich alle brauchst, um weiterzumachen. Promise.allSettled löst immer mit Status und Wert für jeden Eintrag auf, was zu unabhängigen Operationen passt, bei denen ein Fehlschlag nicht die übrigen abbrechen soll.
4
Wie behandelst du Fehler bei async/await? Was passiert bei einer unhandled Rejection?
Antwort
Du umschließt awaitete Aufrufe mit try/catch oder hängst .catch an das zurückgegebene Promise. In Express wird ein Fehler, der innerhalb eines async-Handlers geworfen wird, vom Framework nicht abgefangen, sofern du ihn nicht an next() weiterreichst, weshalb die meisten Teams einen Wrapper oder express-async-errors verwenden. Eine unhandled Rejection beendet in modernen Node-Versionen standardmäßig den Prozess, und das ist beabsichtigt — der Prozess befindet sich in einem unbekannten Zustand und sollte neu gestartet werden.
5
Was sind Streams, und wann nutzt du sie statt eine ganze Datei einzulesen?
Antwort
Streams verarbeiten Daten in Chunks, sodass der Speicherverbrauch unabhängig von der Payload-Größe konstant bleibt und das erste Byte gesendet werden kann, bevor das letzte gelesen ist. Eine Zwei-Gigabyte-Datei in einen Buffer zu lesen erschöpft den Speicher und verzögert die Antwort; per pipe fließt dieselbe Datei direkt zum Client. Streams lassen sich außerdem über pipe oder pipeline komponieren, sodass du Dekompression, Transformation und Ausgabe verketten kannst, während Backpressure automatisch gehandhabt wird.
6
Was ist Middleware in Express? Wie funktioniert next()?
Antwort
Middleware ist eine Funktion, die Request, Response und next entgegennimmt und in Registrierungsreihenfolge ausgeführt wird, sodass eine Pipeline entsteht. Der Aufruf von next() gibt die Kontrolle an die nächste Middleware weiter; wird es nicht aufgerufen und auch keine Response gesendet, bleibt der Request hängen. Ein Argument an next() zu übergeben springt vor zur Error-Handling-Middleware, die daran erkannt wird, dass sie vier Parameter hat.
7
Wie geht Node mit rechenintensiven Aufgaben um? Was sind Worker Threads?
Antwort
Weil JavaScript auf einem einzigen Thread läuft, blockiert eine CPU-lastige Berechnung jeden wartenden Request. Worker Threads führen JavaScript in parallelen Threads innerhalb desselben Prozesses aus und kommunizieren per Message Passing und Shared Array Buffers, was sich für Hashing, Bildverarbeitung oder Parsing eignet. Die Alternativen sind, die Arbeit an einen separaten Service oder eine Job Queue auszulagern — Clustering fügt lediglich Prozesse hinzu und macht einen einzelnen Request nicht schneller.
8
Was ist ein JWT? Wo speicherst du es, und welche Risiken gibt es?
Antwort
Ein JWT ist ein signiertes Token, das Claims trägt, sodass der Server einen Request authentifizieren kann, ohne eine Session nachzuschlagen. Es in localStorage zu speichern setzt es XSS aus; die Speicherung in einem httpOnly-, Secure-, SameSite-Cookie schützt vor XSS, verlangt aber CSRF-Schutz. Der tiefere Trade-off betrifft den Widerruf: Ein Stateless-Token bleibt gültig, bis es abläuft, weshalb sensible Systeme kurzlebige Access Tokens mit Refresh Tokens und einer serverseitigen Denylist einsetzen.
9
Was ist der Unterschied zwischen require und import? Was sind CommonJS und ESM?
Antwort
CommonJS require ist synchron, wird zur Laufzeit aufgelöst und lässt sich innerhalb einer Funktion bedingt aufrufen. ESM import ist statisch, wird gehoistet und vor der Ausführung analysiert, was Tree Shaking und Top-Level-await ermöglicht. Ein Package legt sein Format über "type": "module" oder die Endungen .mjs und .cjs fest; ESM kann CommonJS importieren, umgekehrt braucht es dagegen ein dynamisches import(), weil require keinen asynchronen Modulgraphen laden kann.
10
Wie implementierst du einen Graceful Shutdown?
Antwort
Bei SIGTERM hörst du mit server.close() auf, neue Verbindungen anzunehmen, lässt laufende Requests fertig werden und schließt danach Datenbank-Pools, Message Consumer und Timer, bevor du beendest. Ein Timeout erzwingt das Beenden, falls etwas hängt, damit der Container nie feststeckt. Ohne das reißt ein Deployment Requests mitten im Ablauf ab und kann Transaktionen oder Queue-Nachrichten in einem inkonsistenten Zustand hinterlassen.
🦎
Antworten lesen reicht nicht
Im echten Interview sprichst du unter Druck. Cam stellt genau diese Fragen, bewertet jede Antwort und zeigt dir genau, was du verbessern musst.
Node.js-Backend-Interview üben →Kostenlos · 3 Interviews im Monat