Open Source im professionellen Einsatz
Linux-Magazin 05/2013
786

Module

Node.js eröffnet mit seinen Modulen die Möglichkeit, Objekte auszulagern und erneut zu verwenden. Listing 6 zeigt den Echo-Server aus Listing 2 als Node.js-Modul. Es liegt im aktuellen Arbeitsverzeichnis in der Datei »echo.js« . Der Quelltext des Echo-Servers aus Listing 2 kommt in die Methode »start()« des Objekts »exports« . Listing 7 schließlich zeigt, wie sich das Modul verwenden lässt, wenn es ebenfalls im aktuellen Arbeitsverzeichnis liegt.

Listing 6

Echo-Server als öffentliche Methode

01 var http = require('http');
02 exports.start = function(port) {
03  return http.createServer(function(req, resp) {
04   resp.writeHead(200, {'Content-Type': 'text/plain'});
05   resp.end(req.url);
06  }).listen(port);
07 }

Listing 7

Module unter Node.js

01 var echo = require('./echo.js');
02 var server = echo.start(3000);

Die Require-Funktion in Zeile 1 bindet das Modul über den relativen Pfad »./echo.js« ein. Der Aufruf von Require gibt eine Referenz auf das Objekt »exports« in Listing 6 zurück. Exports enthält alle öffentlichen Eigenschaften und Methoden des Moduls, auch die Methode »start()« aus Zeile 2.

Node.js-Module lassen sich zudem mit dem mitgelieferten Paketmanager Npm packen, veröffentlichen und wieder einbinden. Das Projekt Npmjs [5] verwaltet zurzeit etwa 20 000 gepackte Module. Mit »sudo npm install package-name« installiert Npm das gepackte Modul lokal im Unterverzeichnis »node_modules« des aktuellen Arbeitsverzeichnisses. »sudo install -g package-name« dagegen installiert es global in der Verzeichnisstruktur der Node.js-Distribution.

Listing 8 zeigt beispielhaft die Verzeichnisstruktur des entpackten Moduls »echo« . Es beinhaltet eine Paketbeschreibung in der Datei »package.json« sowie das eigentliche Echo-Modul aus Listing 6 in der Datei »index.js« . Die Paketbeschreibung in Listing 9 enthält ein Json-Objekt mit den Feldern »name« , »version« und »dependencies« , also Abhängigkeiten zu anderen Modulen.

Listing 8

Verzeichnisstruktur des Echo-Moduls

01 |+ node_modules
02  |+ echo
03   |- package.json
04   |- index.js

Listing 9

Paketbeschreibung

01 {
02   "name": "Echo Server",
03   "version": "0.0.1",
04   "dependencies": {
05   "http": "*"
06   }
07 }

Abbildung 4: Mit einem Klick auf Checkout meldet sich der Fahrer am Parkhaus ab.

Abbildung 5: Datenbanksysteme können durch geringere Konsistenz an Verfügbarkeit gewinnen.

Echo hängt lediglich von »http« ab. Der Feldwert »*« in Zeile 5 steht dabei für jede beliebige Version von »http« . Alternativ kann der Admin hier auch – wie in Listing 13 – konkrete Versionsnummern angeben. Module im Unterverzeichnis »node_modules« findet die Require-Funktion anhand des Verzeichnisnamens, beispielsweise »require('echo')« .

Npm bringt für Node.js zahlreiche Erweiterungen, um funktionale Webanwendungen in wenigen Schritten zu erstellen. Das folgende Beispiel zeigt, wie Programmierer mit Node.js, dem Webframework Express, der Templatesprache Jade [6] und dem NoSQL-Datenbanksystem Redis [7] eine Webanwendung bauen. Abbildung 4 zeigt als Beispielanwendung ein Buchungssystem für Parkhäuser im Einsatz. Mit Buchungscode kann der Fahrer einchecken, ohne zu warten. Nach dem Checkout gibt das System den Parkplatz wieder zur Reservierung frei.

Redis

Relationale Datenbanksysteme wie etwa MySQL erwarten, dass der Programmierer alle Datenbankobjekte deklariert hat. Die konstante Pflege des Schemas wird schnell aufwändig und damit kostenintensiv. Zwar speichert ein relationales Datenbanksystem die Daten stets konsistent, doch die dazu nötigen Maßnahmen gehen auch zu Lasten der Verfügbarkeit. NoSQL-Datenbanksysteme wie Redis verringern die Konsistenz der Daten zugunsten höherer Verfügbarkeit (Abbildung 5). Eine vorherige Deklaration der Objekte ist nicht nötig.

Im folgenden Beispiel soll Redis die Daten der Anwendung speichern. Redis ist Open-Source-Software unter BSD-Lizenz und lag bei Redaktionsschluss in Version 2.6.5 vor. Unter Ubuntu 12.10 installiert der Admin Redis mit dem simplen Befehl »sudo apt-get install redis« .

Redis speichert strukturierte Daten wie Listen, Hashes, Mengen und Zeichenketten im Hauptspeicher des Servers und auf Wunsch auch auf der Festplatte. Die Datenhaltung im Hauptspeicher macht Redis performant: Obwohl der Redis-Server nur in einem Prozess läuft, kann er auf einem durchschnittlichen Linux-Server bis zu 500000 Operationen pro Sekunde ausführen [8].

Die Leistung der NoSQL-Datenbank ergibt sich primär durch den freien Hauptspeicher, es lassen sich aber auch mehrere Server zu einem Cluster zusammenfassen. Zudem bietet Redis atomare Operationen und verfügt über einen Transaktions-Mechanismus. Listing 10 zeigt Redis in der Beispielanwendung zusammen mit Node.js.

Listing 10

Redis anbinden

01 var db = require('redis').createClient();
02
03 exports.book = function(req, res) {
04  stats(function(free) {
05   if (free > 0) {
06     var code = "XCP"+Math.floor(Math.random()*1000);
07     db.sadd("open", code);
08   }
09   show(res, 'book', (free>0)?0:1, code);
10  });
11 };
12
13 exports.checkin = function(req, res) {
14   var code = req.body.code;
15  db.srem("open", code, function(err, rp) {
16   if (rp > 0) {
17     db.sadd("checkedIn", code);
18   }
19   show(res, 'checkin', (rp>0)?0:1, code);
20  });
21 };
22
23 exports.checkout = function(req, res) {
24   var code = req.body.code; // closure
25   db.srem("checkedIn", code, function(err, rp) {
26   show(res, 'checkout', (rp>0)?0:1, code);
27  });
28 };

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Bücher

    Die Bücherseite greift zwei aktuelle Trends auf: Das erste Werk behandelt die Anwendungsentwicklung mit dem Javascript-Server Node.js. Das zweite möchte Java- und C-Programmierer in die Arbeit mit mehreren Prozessoren und Nebenläufigkeit einführen.

  • Web RTC

    Das Protokoll Web RTC macht den Browser zur Kommunikationszentrale: Ganz ohne Plugins erledigt er Videochats oder Datei-Übertragungen über Peer-to-Peer-Verbindungen.

  • Node.js

    Die Javascript-basierte Programmierumgebung für Webentwicklung Node.js bändigt den Ressourcen-Hunger von Echtzeit-Webanwendungen wie Onlinespielen oder Chatservern. Dank eines ereignisorientierten Ansatzes kommt Node.js dabei mit einem Webserver-Thread pro Instanz aus.

  • Super-Nginx bündelt Redis, Drizzle und Lua

    Einer der Rails-Hauptentwickler paketiert den schnellen Webserver Nginx mit einer Reihe zukunftsträchtiger Technologien.

  • Node 7.0.0 unterstützt mehr ES6-Features und parst URLs standardkonform

    Node 7.0.0 ist erschienen. Die darin verwendete Version 5.4 von V8 deckt die ES6-Funktionen zu 98 Prozent ab. Zudem verbessert die Version den Umgang mit URLs.

comments powered by Disqus

Ausgabe 07/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.