Node.js
Literaturhinweise
W3Schools Node.js Tutorial
Roden: Node.js & Co. - Kapitel 3 ff.
Einführung
Node.js ist ein Framework, das es erlaubt, serverseitig JavaScript-Programme auszuführen. Mit einer Vielzahl von webspezifischen Erweiterungen bietet es einen mächtigen Funktionsumfang für die Implementierung von Webanwendungen.
Für die Entwicklung kann eine lokale Node.js-Installation als Laufzeitumgebung (Runtime) in Eclipse IDE for JavaScript and Web Developers eingebunden werden: Einstellungen -> JavaScript -> Runtimes -> Global Node Installation -> Edit oder Add
Über Run As -> Standalone Node.js Application lässt sich das Programm ausführen.
Erstes Programm:
console.log("Hello World");
Node.js Programme haben grundsätzlich dieselbe Struktur wie clientseitige Programme. Die API ist weitestgehend identisch. Beispielsweise lassen sich auch Timeouts verwenden:
function world() { console.log("Welt"); } setTimeout(world, 2000); console.log("Hallo");
Ausgabe auf der Konsole:
Hallo Welt (2 Sekunden verzögert)
Für die Interaktion mit einem Client (Browser) über eine HTTP-Verbindung wird das HTTP-Modul importiert, der Server erzeugt und an einen Port (hier: 3000) gebunden:
Beim Erzeugen des Servers mit createServer wird eine Funktion (hier: serve) übergeben, die als Eventhandler aufgerufen wird, sobald ein HTTP-Request auf Port 3000 ankommt. Über die beiden Parameter req und res hat die Funktion Zugriff auf die Daten des Requests (req) und kann die Antwort (Response, res) schreiben.
Für Debugging-Zwecke kann es sinnvoll sein, Informationen zum Request auf der Konsole auszugeben oder ins Log zu schreiben:
Ausgabe auf der Konsole beim Aufruf http://localhost:3000:
*************************** { host: 'localhost:3000', connection: 'keep-alive', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'accept-encoding': 'gzip, deflate, sdch, br', 'accept-language': 'en-US,en;q=0.8' } =========================== / *************************** { host: 'localhost:3000', connection: 'keep-alive', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', accept: 'image/webp,image/*,*/*;q=0.8', referer: 'http://localhost:3000/', 'accept-encoding': 'gzip, deflate, sdch, br', 'accept-language': 'en-US,en;q=0.8' } =========================== /favicon.ico
Hierbei fällt auf, dass vom Browser offenbar zwei Requests abgesetzt werden. Zusätzlich zur eigentlichen Anfrage nach dem URL / wird eine Anfragenach dem URL /favicon.ico abgesetzt. Dies ist ein Standardverhalten der Browser, das sich clientseitig nur durch eine Präparation der HTML-Seite deaktivieren lässt, z. B. mit der folgenden Angabe im head (Quelle: stackoverflow):
<link rel="icon" href="data:;base64,=">
Da wir momentan nur Requests über die Adresszeile eingeben, lässt sich das Verhalten clientseitig bei Verwendung einen Browsers überhaupt nicht unterdrücken. Wird ein reiner HTTP-Client wie z. B. Postman verwendet, erfolgt diese Anfrage nicht.
URL analysieren
In der Ausgabe lässt sich darüberhinaus erkennen, dass das Request-Objekt umfangreiche Informationen über die Anfrage enthält, darunter den URL. Auf diesem kann mit dem Attribut url zugegriffen werden. Damit lassen in Abhängigkeit des URL verschiedene Aktionen ausführen:
Verarbeitung von favicon-Requests unterbinden
Mit dem Wissen um die Eigenschaften des Request-Objekts lässt sich nun die (weitere) Verarbeitung der favicon-Requests unterbinden, indem der entsprechende URL vor allen anderen abgefangen wird:
Node.js Module
Hinweis zur Installation von Modulen mit npm: bei einigen Modulen (z. B. express) wird in der IDE der Syntaxfehler "Unexpected token ILLEGAL" angezeigt. Dies lässt sich umgehen, indem die Module mit der Option --no-bin-links installiert werden:
> npm install --no-bin-links express
Aufteilen von Skripten auf mehrere Dateien
Wenn das serverseitige Skript sehr umfangreich wird, teilt man es üblicherweise auf mehrere .js Dateien auf. In Node.js erfolgt dies, indem man die einzubindende Datei als Modul aufbaut und dieses mittels require einbindet.
Datei, die eingebunden werden soll (helper.js im selben Verzeichnis wie die Serverapp):
module.exports = { foo: function () { // ... }, bar: function () { // ... } }; var privat = function () { // ... }
Die Funktionen foo und bar sind jetzt extern verfügbar, die Funktion privat dagegen nicht. Einbinden von helper.js in die Serverapp:
var helper = require('./helper'); console.log(typeof helper.foo); // => 'function' console.log(typeof helper.bar); // => 'function' console.log(typeof helper.privat); // => undefined
(Quelle: Stack Overflow)
Postman
Postman ist eine Chrome-App, die als Standalone-HTTP-Client verwendet werden kann. Sie eignet sich im Entwicklungsprozess insbesondere zum Testen von HTTP-Servern und REST-Interfaces.