Node.js wurde erstmals im Jahr 2009 veröffentlicht und dient zur Entwicklung von echtzeitfähigen und skalierbaren Webanwendungen. Es ist ein serverseitiges, plattformunabhängiges JavaScript Framework auf der Basis der V8 JavaScript-Engine von Google. Das Ziel der V8 Engine ist die Ausführung von JavaScript-Code zu beschleunigen. Dies geschieht dadurch, dass der JavaScript-Code direkt in nativen Maschinencode kompiliert wird. Die V8 Engine wird unter anderem im Google Chrome Browser verwendet.
Auf der Grundlage von unterschiedlichen Protokollen, wie zum Beispiel HTTP, TCP oder UDP lassen sich mit Node.js serverbasierte Applikationen entwickeln.
Eventhandling in Node.js
Node.js besitzt eine ereignisgesteuerte Architektur, welche die zentrale Kontrollstruktur darstellt. Die ereignisgesteuerte Architektur wird durch einen sogenannten Event-Loop realisiert. Dieser nimmt Anfragen von Clients entgegen und delegiert diese an eine entsprechende Callback-Funktion weiter.
Der Event-Loop befindet sich zunächst in einem ruhenden bzw. auf Anfragen wartenden Zustand. Sobald ein Client eine Anfrage an die Applikation sendet, wird der Event-Loop vom Betriebssystem aktiviert. Der Event-Loop übergibt die Anfrage des Clients an eine definierte Callback-Funktion, die mit der Abarbeitung der Anfrage beansprucht wird. In dieser Zeit, kann der Event-Loop neue Anfragen von Clients entgegen nehmen und an entsprechend registrierte Callback-Funktionen weitergeben. Sobald eine Callback-Funktion eine Anfrage abgearbeitet hat, übergibt diese das Ergebnis zurück an den Event-Loop, welcher dann wiederum das Ergebnis an den anfragenden Client zurücksendet.
Der Event-Loop ist single-threaded. Dies bedeutet, dass alle Anfragen von Clients zunächst an diesen einen Thread übergeben werden. Zum Vergleich: Bei klassischen Serverumgebungen wird für jede Anfrage mindestens ein neuer Thread gestartet und somit für jeden Thread ein bestimmter Speicherplatz reserviert, was bei vielen Anfragen den Server schnell an seine Grenzen bringen kann. (C10K-Problem)
Eine Node.js-Anwendung besteht in den meisten Fällen ebenfalls aus mehreren Threads, jedoch mit den Unterschied, dass der Event-Loop zu jeder Zeit Anfragen entgegen nehmen kann und an entspreche Callback-Funktionen weitergeben kann.
Innerhalb des Event-Loops sollten keine blockierenden Abfragen oder Berechnungen stattfinden, damit dieser jederzeit Anfragen ohne Verzögerung entgegen nehmen kann. Der Aufbau einer Node.js Anwendung sollte also möglichst asynchron, mit Hilfe von Callback-Funktionen, gestaltet werden.
Für den Fall, dass mehrere Anfragen gleichzeitig auftreten, werden diese in einer Node.js Applikation nach dem „first-in first-out“-Prinzip behandelt und nacheinander abgearbeitet.
Für die Implementierung eines einfachen HTTP-Webservers sind nur wenige Zeilen von Nöten.
var http = require('http'); http.createServer(function (request, response) { // mache etwas, sobald ein Client sich verbindet }).listen(4442); console.log('Dieser Server lauscht auf dem Port 4442');
Durch require(‚http‘) wird das bereits in Node.js enthaltene HTTP-Modul eingebunden. Dieses Modul stellt Methoden für die Realisierung eines HTTP-Servers bereit. Mit der Methode createServer() wird der Server initalisiert. Als Parameter erhält diese Funktion eine Callback-Funktion, die ausgeführt wird, sobald ein Client sich mit dem Server verbindet. Zum Schluss muss noch bestimmt werden, auf welchem Port die Anwendung auf Anfragen warten soll. Dies geschieht durch .listen(4442).
Soweit so gut. Dies war ein kleiner Ausschnitt meiner Bachelorarbeit. Falls noch größeres Interesse an dieser Technologie besteht, lasst es mich gern wissen – dann gibt es mehr zu dem Thema.