Node.js ist eine ser­ver­sei­ti­ge Lauf­zeit­um­ge­bung für Ja­va­Script. Sie er­mög­licht es, Ja­va­Script nicht nur im Browser, sondern auch auf Servern aus­zu­füh­ren, und eignet sich besonders für die Ent­wick­lung ska­lier­ba­rer und er­eig­nis­ge­steu­er­ter An­wen­dun­gen. Dank seiner asyn­chro­nen, nicht blo­ckie­ren­den Ar­chi­tek­tur können Ent­wick­le­rin­nen und Ent­wick­ler mit Node.js ef­fi­zi­en­te Netzwerk- und Echt­zeit­an­wen­dun­gen erstellen.

Was ist Node.js?

Node.js ist eine ser­ver­sei­ti­ge Lauf­zeit­um­ge­bung, die auf der V8-Ja­va­Script-Engine von Google Chrome basiert und es er­mög­licht, Ja­va­Script-Code außerhalb des Browsers aus­zu­füh­ren. Dadurch können sowohl Client- als auch Ser­ver­lo­gik in derselben Sprache im­ple­men­tiert werden, was die Ent­wick­lung kon­sis­ten­ter und ef­fi­zi­en­ter gestaltet. Ein zentrales Merkmal von Node.js ist seine er­eig­nis­ge­steu­er­te und nicht-blo­ckie­ren­de Ar­chi­tek­tur, die eine hohe Anzahl gleich­zei­ti­ger Ver­bin­dun­gen bei minimalem Res­sour­cen­ver­brauch erlaubt.

Anstatt für jede Anfrage einen neuen Thread zu starten, verwendet Node.js ein so­ge­nann­tes Event-Loop-Modell, das Aufgaben in einer Schleife ver­ar­bei­tet und auf Er­eig­nis­se reagiert, sobald sie auftreten. Diese Ar­chi­tek­tur macht Node.js besonders geeignet für I/O-lastige An­wen­dun­gen wie Webserver. Über den Node Packet Manager (npm) steht ein um­fang­rei­ches Ökosystem an Modulen, Bi­blio­the­ken und Tools zur Verfügung, das die schnelle Im­ple­men­tie­rung komplexer Funk­tio­nen er­leich­tert. Node.js ist zudem platt­form­un­ab­hän­gig, läuft auf Windows, macOS und Linux und lässt sich sowohl für kleine Ser­ver­an­wen­dun­gen als auch für hoch­ska­lier­ba­re Mi­cro­ser­vices-Ar­chi­tek­tu­ren einsetzen.

In­stal­la­ti­on von Node.js

Bevor Sie mit Node.js arbeiten können, müssen Sie Node.js auf Ihrem Rechner in­stal­lie­ren. Die Lauf­zeit­um­ge­bung bringt alles mit, was Sie benötigen: Ja­va­Script, das Command Line Interface (CLI) für die Aus­füh­rung von Skripten sowie den Pa­ket­ma­na­ger npm, der den Zugriff auf zu­sätz­li­che Module und Bi­blio­the­ken er­mög­licht. Mit dieser Umgebung können Sie sowohl einfache Skripte testen als auch komplexe Server- und Web­an­wen­dun­gen ent­wi­ckeln.

Besuchen Sie für den Download zunächst die of­fi­zi­el­le Node.js-Webseite. Auf der Start­sei­te sehen Sie in der Regel zwei Versionen: die LTS-Version (Long Term Support) und die aktuelle Version. Für Ein­stei­ge­rin­nen und Ein­stei­ger sowie pro­duk­ti­ve Projekte empfiehlt sich die LTS-Version, da sie lang­fris­tig un­ter­stützt wird und stabiler läuft.

Bild: Screenshot der Homepage Node.js
Wählen Sie einfach Ihr Be­triebs­sys­tem und die ge­wünsch­te Version von Node.js aus.

Klicken Sie auf den Download-Button für Ihr Be­triebs­sys­tem. Kopieren Sie die Ter­mi­nal­be­feh­le oder öffnen Sie das her­un­ter­ge­la­de­ne In­stal­la­ti­ons­pa­ket und folgen Sie den An­wei­sun­gen des In­stal­lers. Dabei können Sie die Stan­dard­op­tio­nen über­neh­men.

Nachdem die In­stal­la­ti­on ab­ge­schlos­sen ist, öffnen Sie Ihr Terminal. Geben Sie folgende Befehle ein, um si­cher­zu­stel­len, dass Node.js korrekt in­stal­liert wurde:

node -v
npm -v
bash

Wenn Ihnen beide Befehle eine Ver­si­ons­num­mer ausgeben, ist Node.js ein­satz­be­reit. Damit können Sie nun eigene Ja­va­Script-Skripte ausführen oder Node.js-Webserver starten.

Node.js-Tutorial: Erstes Hello-World im CLI

Sobald Node.js in­stal­liert ist, können Sie die Kom­man­do­zei­le nutzen, um Ja­va­Script-Code direkt auf Ihrem Rechner aus­zu­füh­ren. Dies ist eine einfache Mög­lich­keit, die Funk­tio­na­li­tät von Node.js zu testen, ohne sofort einen kom­plet­ten Webserver auf­zu­bau­en.

Erstellen Sie eine neue Datei mit dem Namen hello.js und fügen Sie folgenden Code ein:

console.log("Hello, World!");
Ja­va­Script

Der Befehl console.log() ist eine ein­ge­bau­te Ja­va­Script-Funktion, die Inhalte auf der Stan­dard­aus­ga­be - in diesem Fall Ihre Konsole - ausgibt. Node.js in­ter­pre­tiert diesen Befehl und gibt den Text direkt im Terminal aus. Sie können die Datei speichern und an­schlie­ßend über das Terminal oder die Ein­ga­be­auf­for­de­rung in das Ver­zeich­nis der Datei na­vi­gie­ren. Dort führen Sie den Befehl aus:

node hello.js
bash

Sie sollten nun folgende Ausgabe sehen:

Hello, World!

Dieses einfache Beispiel de­mons­triert, wie Node.js als Ja­va­Script-Lauf­zeit­um­ge­bung auf Ihrem Rechner funk­tio­niert und wie Code in der Konsole aus­ge­führt werden kann, bevor Sie zu kom­ple­xe­ren An­wen­dun­gen übergehen.

Hello-World Webserver erstellen

Neben einfachen Skripten eignet sich Node.js her­vor­ra­gend für das Erstellen von Web­ser­vern. Mit wenigen Zeilen Code können Sie einen funk­tio­nie­ren­den HTTP-Server aufsetzen, der auf Anfragen reagiert.

Erstellen Sie hierzu zunächst eine Datei namens server.js mit folgendem Inhalt:

const http = require('http'); // Importiert das eingebaute HTTP-Modul
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200; // HTTP-Statuscode 200 = OK
res.setHeader('Content-Type', 'text/plain'); // Definiert, dass die Antwort reiner Text ist
res.end('Hello, World!\n'); // Sendet den Text an den Client und beendet die Antwort
});
server.listen(port, hostname, () => {
console.log(`Server läuft unter http://${hostname}:${port}/`);
});
Ja­va­Script

Node.js verfügt über ein ein­ge­bau­tes Modul namens http, das Funk­tio­nen für die Kom­mu­ni­ka­ti­on über das HTTP-Protokoll be­reit­stellt. Mit require('http') binden wir dieses Modul zunächst ein.

http.createServer() erzeugt dann einen neuen Webserver. Die über­ge­be­ne Funktion (req, res) => { ... } wird bei jeder ein­ge­hen­den Anfrage auf­ge­ru­fen. req enthält In­for­ma­tio­nen zur ein­ge­hen­den Anfrage, wie bei­spiels­wei­se URL, Header oder Parameter. res wird genutzt, um eine Antwort an den Client zu senden.

Der Code­schnip­sel res.statusCode = 200; legt den Sta­tus­code der HTTP-Antwort fest (200 = er­folg­reich). Auch der MIME-Typ der Antwort, in diesem Fall einfacher Text, wird definiert. Mit res.end('Hello, World!\n'); wird die Nachricht an den Client gesendet und die Antwort beendet.

Starten Sie nun die Datei mit Node.js:

node server.js
bash

Öffnen Sie an­schlie­ßend einen Web­brow­ser oder verwenden Sie ein Tool wie curl und rufen Sie folgende IP-Adresse auf:

http://127.0.0.1/

Sie sollten die Meldung “Hello, World!” sehen, was bestätigt, dass der Webserver korrekt funk­tio­niert.

Mo­dul­struk­tur und npm

Node.js basiert auf einer modularen Ar­chi­tek­tur, die es Ent­wick­le­rin­nen und Ent­wick­lern er­mög­licht, An­wen­dun­gen in kleinere, wie­der­ver­wend­ba­re Einheiten zu un­ter­tei­len. Diese Einheiten, so­ge­nann­te Module, kapseln bestimmte Funk­tio­na­li­tä­ten wie Da­tei­ver­ar­bei­tung, Netz­werk­kom­mu­ni­ka­ti­on oder ma­the­ma­ti­sche Be­rech­nun­gen und können in anderen Teilen der Anwendung im­por­tiert und genutzt werden. Node.js bietet neben den in­te­grier­ten Kern­mo­du­len wie fs (Da­tei­sys­tem), dem bereits genutzten Modul http oder path auch die Mög­lich­keit, eigene Module zu erstellen, um spe­zi­fi­sche Aufgaben innerhalb eines Projekts zu or­ga­ni­sie­ren. Jedes Modul in Node.js ist in einer separaten Datei ge­spei­chert und ex­por­tiert seine Funk­tio­nen oder Objekte über module.exports, sodass andere Dateien diese im­por­tie­ren und verwenden können.

Ein zentraler Be­stand­teil des Node.js-Öko­sys­tems ist der Node Package Manager (npm). Mit npm lassen sich tausende frei ver­füg­ba­re Pakete, die von der Community be­reit­ge­stellt werden, in­stal­lie­ren, verwalten und ak­tua­li­sie­ren. Ent­wi­ckeln­de können npm nutzen, um Ab­hän­gig­kei­ten au­to­ma­tisch in ein Projekt zu in­te­grie­ren, Versionen zu kon­trol­lie­ren und Konflikte zwischen ver­schie­de­nen Paketen zu vermeiden. Pakete werden in einem Projekt ty­pi­scher­wei­se im Un­ter­ver­zeich­nis node_modules abgelegt, während die Datei package.json die Metadaten, Ab­hän­gig­kei­ten und Skripte des Projekts enthält.

Die modulare Struktur und npm er­leich­tern die Wartung und Er­wei­te­rung von Projekten erheblich, da einzelne Module un­ab­hän­gig von­ein­an­der ent­wi­ckelt, getestet und aus­ge­tauscht werden können. Außerdem fördert sie die Code-Wie­der­ver­wend­bar­keit und die Trennung von Ver­ant­wort­lich­kei­ten innerhalb einer Anwendung. In Kom­bi­na­ti­on mit modernen Pa­ket­ver­wal­tungs­tools wie npx lassen sich Node.js-Module auch temporär ausführen, ohne sie dauerhaft in­stal­lie­ren zu müssen, was schnelle Tests und Pro­to­ty­p­ing un­ter­stützt. Dank dieses Systems können Ent­wick­le­rin­nen und Ent­wick­ler sehr komplexe An­wen­dun­gen auf Basis kleiner, gut wartbarer Bausteine erstellen, die leicht ska­lier­bar sind.

An­wen­dungs­be­rei­che von Node.js

Node.js ist nicht nur eine Ja­va­Script-Lauf­zeit­um­ge­bung, sondern auch ein viel­sei­ti­ges Werkzeug für die Ent­wick­lung von An­wen­dun­gen. Im Folgenden werden ex­em­pla­risch drei An­wen­dungs­be­rei­che de­tail­liert vor­ge­stellt.

APIs ent­wi­ckeln

Node.js eignet sich für die Ent­wick­lung von APIs, die als Schnitt­stel­len zwischen ver­schie­de­nen An­wen­dun­gen oder Systemen dienen. Dank der er­eig­nis­ge­steu­er­ten Ar­chi­tek­tur und der nicht-blo­ckie­ren­den I/O-Funk­tio­nen können APIs, die in Node.js ent­wi­ckelt wurden, große Mengen an Anfragen gleich­zei­tig ver­ar­bei­ten, ohne dass die Per­for­mance leidet. Ent­wick­le­rin­nen und Ent­wick­ler nutzen häufig Frame­works wie Express.js, um RESTful-APIs schnell und effizient zu erstellen. Solche APIs er­mög­li­chen es An­wen­dun­gen, Daten zu lesen, zu schreiben oder zu ak­tua­li­sie­ren. Node.js er­leich­tert zudem die In­te­gra­ti­on von Da­ten­ban­ken wie MongoDB, Post­greS­QL oder MySQL, wodurch die API leis­tungs­stark, flexibel und ska­lier­bar wird.

Echt­zeit­an­wen­dun­gen

Auch für Echt­zeit­an­wen­dun­gen, bei denen Daten sofort zwischen Server und Client aus­ge­tauscht werden müssen, ist Node.js her­vor­ra­gend geeignet. Beispiele hierfür sind Chat-An­wen­dun­gen, kol­la­bo­ra­ti­ve Do­ku­men­ten­be­ar­bei­tung oder Live-Da­sh­boards. Durch die Nutzung von Web­so­ckets, die eine bi­di­rek­tio­na­le Kom­mu­ni­ka­ti­on er­mög­li­chen, können Node.js-An­wen­dun­gen sofort auf Be­nut­zer­inter­ak­tio­nen reagieren. Dank der asyn­chro­nen Event-Schleife ist Node.js außerdem in der Lage, viele gleich­zei­ti­ge Ver­bin­dun­gen ohne merkliche Ver­zö­ge­rung zu handhaben. Dies macht es zu einer ge­eig­ne­ten Wahl für An­wen­dun­gen, bei denen La­tenz­zei­ten minimal gehalten werden müssen.

Tools und Au­to­ma­ti­sie­run­gen

Node.js wird häufig auch für die Er­stel­lung von Ent­wick­lungs- und Au­to­ma­ti­sie­rungs­tools genutzt. Dazu zählen Build-Tools, Task-Runner oder Skripte, die wie­der­keh­ren­de Aufgaben au­to­ma­ti­sie­ren. Auch CLI-Tools für die Ad­mi­nis­tra­ti­on oder DevOps-Aufgaben lassen sich leicht in Node.js ent­wi­ckeln, da die Plattform direkten Zugriff auf das Da­tei­sys­tem, das Netzwerk und die Be­triebs­sys­tem­funk­tio­nen bietet.

Beliebte Frame­works für Node.js

Node.js bildet die Grundlage für zahl­rei­che Frame­works, die die Ent­wick­lung erheblich er­leich­tern. Diese Frame­works abs­tra­hie­ren wie­der­keh­ren­de Aufgaben, liefern Struk­tu­ren für sauberen Code und bieten in­te­grier­te Funk­tio­nen, die die Ent­wick­lungs­zeit verkürzen. Zu den be­kann­tes­ten und meist­ge­nutz­ten Frame­works zählen Express, Nest und Socket.io, die jeweils un­ter­schied­li­che Schwer­punk­te und Ein­satz­ge­bie­te haben.

Express.js

Express.js ist eines der am weitesten ver­brei­te­ten Frame­works für Node.js und dient haupt­säch­lich zur Er­stel­lung von Web­an­wen­dun­gen und RESTful APIs. Es ist mi­ni­ma­lis­tisch, flexibel und erlaubt Ent­wick­le­rin­nen und Ent­wick­lern den Einbau eigener Midd­le­wa­re, um HTTP-Anfragen zu ver­ar­bei­ten, Routing zu steuern und Antworten zu liefern. Durch seine schlanke Struktur eignet sich Express für schnelle Pro­to­ty­pen ebenso wie für komplexe An­wen­dun­gen. Dank einer großen Community gibt es zahl­rei­che Er­wei­te­run­gen, die zu­sätz­li­che Funk­tio­nen wie Au­then­ti­fi­zie­rung, Session-Ma­nage­ment oder Template-Engines be­reit­stel­len. Express abs­tra­hiert viele Details des nativen Node.js-HTTP-Moduls, sodass Ent­wi­ckeln­de ef­fi­zi­en­te und wartbare Ser­ver­an­wen­dun­gen erstellen können.

Nest.js

Nest.js ist ein pro­gres­si­ves Framework, das vor allem auf Struktur, Ska­lier­bar­keit und Ty­pen­si­cher­heit setzt. Es verwendet stan­dard­mä­ßig Ty­pe­Script, un­ter­stützt aber auch reines Ja­va­Script und ori­en­tiert sich ar­chi­tek­to­nisch am Web­frame­work Angular. Nest er­leich­tert die Im­ple­men­tie­rung von APIs, Mi­cro­ser­vices und ser­ver­sei­ti­gen An­wen­dun­gen, indem es De­pen­den­cy Injection, de­kla­ra­ti­ve Module und ein ein­heit­li­ches Pattern-System be­reit­stellt. Das Framework richtet sich besonders an größere Projekte, bei denen saubere Ar­chi­tek­tur und lang­fris­ti­ge Wart­bar­keit ent­schei­dend sind.

Socket.io

Socket.io ist ein Framework für die Ent­wick­lung von Echt­zeit­an­wen­dun­gen, das die bi­di­rek­tio­na­le Kom­mu­ni­ka­ti­on zwischen Client und Server er­mög­licht. Es baut auf Web­so­ckets auf, bietet aber zu­sätz­li­che Funk­tio­nen wie Fallbacks für ältere Browser, Ereignis-basierte Kom­mu­ni­ka­ti­on und au­to­ma­ti­sche Re­con­nec­tion. Socket.io wird häufig in An­wen­dun­gen ein­ge­setzt, bei denen Daten sofort zwischen Server und Client aus­ge­tauscht werden müssen. Die In­te­gra­ti­on in Node.js-Projekte ist un­kom­pli­ziert, da das Framework eine einfache API für das Senden und Empfangen von Nach­rich­ten be­reit­stellt. Dank der robusten Ar­chi­tek­tur können Ent­wick­le­rin­nen und Ent­wick­ler ska­lier­ba­re Realtime-Systeme aufbauen, die zu­ver­läs­sig und per­for­mant auf viele gleich­zei­ti­ge Ver­bin­dun­gen reagieren.

KI-Lösungen
Mehr Digital-Power dank Künst­li­cher In­tel­li­genz
  • In Sekunden zur Online-Präsenz
  • Mehr Wachstum mit KI-Marketing
  • Zeit und Res­sour­cen sparen

Vergleich mit PHP und Python

Node.js hebt sich von klas­si­schen ser­ver­sei­ti­gen Sprachen wie PHP und Python ins­be­son­de­re durch seine er­eig­nis­ge­steu­er­te und nicht-blo­ckie­ren­de Ar­chi­tek­tur ab. Während PHP tra­di­tio­nell pro Anfrage einen neuen Prozess startet und für jede Anfrage den gesamten Ablauf durch­läuft, ver­ar­bei­tet Node.js viele gleich­zei­ti­ge Anfragen asynchron innerhalb eines einzigen Prozesses, was die Per­for­mance bei hoher Last deutlich steigern kann. Python hingegen ist zwar viel­sei­tig ein­setz­bar und eignet sich für Web­ent­wick­lung, Da­ten­ana­ly­se und Machine Learning, nutzt aber stan­dard­mä­ßig blo­ckie­ren­de I/O-Ope­ra­tio­nen, wodurch bei Echt­zeit­an­wen­dun­gen zu­sätz­li­che Frame­works wie Asyncio nötig sind.

Ein weiterer Un­ter­schied liegt in der Pro­gram­mier­spra­che selbst: Node.js basiert auf Ja­va­Script, das sowohl im Browser als auch ser­ver­sei­tig verwendet werden kann. Dies er­mög­licht Ent­wick­le­rin­nen und Ent­wick­lern eine ein­heit­li­che Sprache über das gesamte Stack hinweg, während PHP auf den Server be­schränkt ist und Python in Web­pro­jek­ten meist mit Frame­works wie Django oder Flask kom­bi­niert wird.

Node.js eignet sich besonders gut für Echtzeit-An­wen­dun­gen, APIs und Mi­cro­ser­vices, während PHP weiterhin häufig für klas­si­sche Web­an­wen­dun­gen oder Content-Ma­nage­ment-Systeme verwendet wird. Python wiederum überzeugt durch seine Ein­fach­heit, um­fang­rei­che Bi­blio­the­ken in einer Vielzahl an An­wen­dungs­fäl­len. Letztlich hängt die Wahl der Tech­no­lo­gie von den in­di­vi­du­el­len An­for­de­run­gen ab: Node.js bietet Vorteile bei Per­for­mance und Ska­lier­bar­keit, PHP glänzt bei tra­di­tio­nel­len Web­pro­jek­ten, und Python punktet bei da­ten­in­ten­si­ven und ana­ly­ti­schen An­wen­dun­gen.

Best Practices für Ein­stei­ge­rin­nen und Ein­stei­ger in Node.js

Für den Einstieg in Node.js ist es besonders wichtig, bereits von Anfang an gute Pro­gram­mier­ge­wohn­hei­ten zu ent­wi­ckeln, um sauberen, sicheren und wartbaren Code zu schreiben. Ein zentraler Aspekt ist die Struk­tu­rie­rung des Projekts:

  • Trennen Sie Module logisch.
  • Nutzen Sie Ordner für Routen, Con­trol­ler, Modelle und Hilfs­funk­tio­nen.
  • Vermeiden Sie lange mo­no­li­thi­sche Dateien.

Auch die Feh­ler­be­hand­lung spielt in Node.js eine ent­schei­den­de Rolle, da die asyn­chro­ne Natur leicht zu un­vor­her­ge­se­he­nen Abstürzen führen kann. Verwenden Sie Try-Catch-Blöcke bei syn­chro­nem Code und Fehler-Callbacks oder .catch() bei Promises. Bei Express-An­wen­dun­gen sollten Sie eine zentrale Error-Handling-Midd­le­wa­re im­ple­men­tie­ren, um un­er­war­te­te Fehler kon­sis­tent zu behandeln und die Anwendung stabil zu halten.

Ein weiterer nicht zu ver­nach­läs­si­gen­der Punkt ist die Si­cher­heit. Vermeiden Sie die Aus­füh­rung un­va­li­dier­ter Be­nut­zer­ein­ga­ben, nutzen Sie Pa­ra­me­ter­bin­dun­gen bei Da­ten­bank­ab­fra­gen und schützen Sie sensible Daten durch Um­ge­bungs­va­ria­blen. Außerdem empfiehlt es sich, Ab­hän­gig­kei­ten re­gel­mä­ßig zu ak­tua­li­sie­ren, Si­cher­heits­lü­cken mit Tools wie npm audit zu prüfen und HTTPS zu verwenden, um die Kom­mu­ni­ka­ti­on zu ver­schlüs­seln.

Sparen Sie außerdem nicht an Logging und Mo­ni­to­ring: Pro­to­kol­lie­ren Sie Fehler, wichtige Er­eig­nis­se und Leis­tungs­kenn­zah­len, um Probleme früh­zei­tig zu erkennen. Für größere Projekte lohnt sich außerdem die Nutzung von Lintern wie ESLint, um Kon­sis­tenz im Code zu sichern und typische Feh­ler­quel­len zu vermeiden.

Schließ­lich sollten Ein­stei­ge­rin­nen und Ein­stei­ger die Async/Await-Syntax be­vor­zu­gen, da sie die Les­bar­keit asyn­chro­ner Abläufe ver­bes­sert und die Feh­ler­be­hand­lung er­leich­tert.

Zum Hauptmenü