wiki:skript/nodejs

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.

Node.js Webseite

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:

SELECT ALL Einfachster HTTP-Server:
During the example analyzing the following problems appear:
  • Path element is not found.

  

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:

SELECT ALL HTTP-Server mit Log des Requests:
During the example analyzing the following problems appear:
  • Path element is not found.

  

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:

SELECT ALL URL-abhängige Antwort:
During the example analyzing the following problems appear:
  • Path element is not found.

  

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:

SELECT ALL Favicon-Request abfangen:
During the example analyzing the following problems appear:
  • Path element is not found.

  

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.

Last modified 6 years ago Last modified on Oct 14, 2018, 11:19:15 AM