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

Events

Javascript soll es Entwicklern einfacher machen, auf Benutzereingaben zu reagieren. Beim Einsatz im Browser löst ein Klick auf einen Knopf in einer Webseite ein so genanntes Event aus und der Javascript-Interpreter daraufhin die an das Event gebundene Callback-Funktion. Node.js verwendet Events, um auf asynchrone Lese- und Schreiboperationen zu reagieren, der Objekt-Eventemitter aus dem Modul »events« stellt sie zur Verfügung.

Listing 4 demonstriert das Erzeugen des benutzerdefinierten Events »schawawa« für das Objekt »Custom« . Zeile 1 bindet zunächst das Modul »events« ein. Die Zeilen 4 bis 6 speichern in der Variablen »Custom« eine Konstruktor-Funktion. In Zeile 8 weist die Methode »inherits()« das Objekt »EventEmitter« als Prototyp für alle Objekte aus, die mit der Konstruktor-Funktion aus den Zeilen 4 bis 6 erzeugt werden.

Listing 4

Eventemitter vererbt

01 var events = require('events'),
02   util = require('util');
03
04 var Custom = function() {
05  title:"Custom Object";
06 }
07 //Custom.prototype = new events.Emitter;
08 util.inherits(Custom, events.EventEmitter);
09
10 var custom = new Custom();
11 custom.on('schawawa', function(arg) {
12  console.log('react on schawawa with data: '+arg);
13 });
14
15 setTimeout(function() {
16  custom.emit('schawawa', '\\0000');
17 }, 2000);

Dadurch erbt das Objekt »Custom« in Zeile 10 alle Methoden und Eigenschaften vom »EventEmitter« . Die Methode »on()« vereinbart in den Zeilen 11 bis 13 für das Schawawa-Event eine Callback-Funktion. Die Zeilen 15 bis 17 lösen Schawawa durch Aufruf der Methode »emit()« mit einer Verzögerung von 2000 Millisekunden aus. Emit übernimmt als ersten Parameter den Namen des auszulösenden Events. Die folgenden Parameter reicht das Skript an die Callback-Funktion weiter.

Streams

Streams vereinfachen das Lesen und Schreiben von Daten in Node.js. Ein Stream bietet den Zugriff auf seine Daten mit Hilfe der gleichnamigen Schnittstelle. Eine HTTP-Anfrage – etwa »req« in Listing 2 – ist ein lesender Stream. Eine HTTP-Antwort – etwa »resp« in Listing 2 – ist ein schreibender Stream.

Ein lesender und ein schreibender Stream lassen sich mit der Methode »pipe()« verlustfrei synchronisieren. Pipe unterbricht die Synchronisation, wenn ein Buffer überzulaufen droht. Listing 5 zeigt Streams am Beispiel eines streamenden HTTP-Servers. Die Zeilen 1 bis 3 binden zunächst alle benötigten Module ein. Die Variable »www« in Zeile 4 speichert das Wurzelverzeichnis des HTTP-Servers, das Objekt »mimes« in Zeile 5 die Mime-Typen, das Objekt »errors« in Zeile 6 alle Statusmeldungen aus dem HTTP-Protokoll. Die Zeilen 8 bis 20 erzeugen das HTTP-Server-Objekt und binden es an den Port 3001.

Listing 5

Pipe synchronisiert

01 var http=require('http'),
02   path=require('path'),
03   fs=require('fs'),
04   www="www",
05   mimes={"jpg":"image/jpeg","webm":"video/webm"};
06   errors={404:"Not found", 415:"Unsupported Media Type"};
07
08 http.createServer(function(req, res) {
09  var med=path.join(www, req.url),
10   mime=mimes[path.extname(med).substring(1)];
11  if (mime) {
12   var rst=fs.createReadStream(med);
13   rst.on("open", function() {res.writeHead(200, {'Content-Type': mime})});
14   rst.on("end", function() {res.end();});
15   rst.on("error", function() {error(res, 404, med)});
16   rst.pipe(res);
17  } else {
18   error(res, 415, med);
19  }
20 }).listen(3001);
21
22 function error(res, code, path) {
23   res.writeHead(code, {'Content-Type': "text/html"});
24   res.end("<h1>"+code+" - "+errors[code])
25 }

Die Callback-Funktion findet sich in den Zeilen 8 bis 20. Zunächst hängt Zeile 9 den Pfadanteil der aufgerufenen URL an den Pfad des Wurzelverzeichnisses an und speichert ihn in der Variablen »med« . Die folgende Zeile liest den Mime-Type der HTTP-Antwort anhand der Datei-Erweiterung der angefragten Datei aus dem Objekt »mimes« aus und speichert ihn in der Variablen »mime« .

Für einen bekannten Mime-Typ erzeugt Zeile 12 einen lesenden Stream auf der abgefragten Datei »med« und speichert ihn im Objekt »rst« . Die Übertragung der Datei in die HTTP-Antwort mit »pipe()« in Zeile 16 beginnt erst nach dem Ausführen der Callback-Funktion zum Event »open« in Zeile 13. Den Abschluss der Übertragung macht die HTTP-Antwort im Callback zum Event »end« . Im Fehlerfall (Zeile 15 oder 18) gibt der Server statt der Datei eine Fehlermeldung aus (Funktion »error()« in den Zeilen 22 bis 25). Abbildung 3 zeigt ein Video im Webbrowser Firefox, das Node.js als HTTP-Server auf den Client streamt.

Abbildung 3: Live vom Localhost: Der HTTP-Server streamt ein Video.

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 10/2017

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

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