Cover

Inhalt

Titelei

Impressum

Inhalt

Vorwort

Über die Autoren …

… und ihre Motivation

Das Zielpublikum

Das Buch

Die Welt von JavaScript

1 Hello, Node.js

1.1 Einführung in Node.js

1.2 Installation

1.2.1 Windows

1.2.2 Mac OS X

1.2.3 Debian

1.2.4 Ubuntu

1.2.5 openSUSE und SLE

1.2.6 Fedora

1.2.7 RHEL und CentOS

1.3 IDEs

1.3.1 cloud9

1.3.2 WebStorm

1.3.3 Nodeclipse

1.3.4 WebMatrix/VisualStudio

1.3.5 Atom

1.4 nvm & nodist ‒ mit Node-Versionen jonglieren

1.4.1 *ix-Systeme

1.4.2 Windows

1.5 npm ‒ Node Packaged Modules

1.5.1 npm install ‒ ein Modul laden

1.5.2 Global? Lokal?

1.5.3 package.json

1.5.4 Module patchen

1.5.5 Browserify

1.6 Kein Code?

2 You build it …

2.1 File I/O

2.1.1 Dateifunktionen in Node.js

2.1.2 Permissions

2.1.3 „watch“ ‒ Änderungen im Auge behalten

2.1.4 Erweiterungen

2.2 Streams

2.2.1 Aus Streams lesen …

2.2.2 … und in Streams schreiben

2.2.3 Eigene Streams implementieren

2.2.4 Buffers and Strings

2.3 Daten für immer

2.3.1 Neo4j

2.3.2 MongoDB

2.4 Sichtbarkeit erzeugen ‒ im Web

2.4.1 Middleware Framework Connect

2.4.2 Webentwicklung mit Express

2.4.3 Express 4

2.4.4 Jade

2.4.5 swig

2.4.6 Sessions & Authentifizierung

2.5 socket.io

2.5.1 Verbindung herstellen

2.5.2 Kommunikation

2.5.3 Broadcast

2.5.4 Private Daten

2.5.5 Rückantwort und Bestätigung

2.5.6 Namespaces

2.5.7 Räume

2.5.8 Autorisierung

2.5.9 Sessions mit „socket.io-session“

2.5.10 Version 1.0

2.6 Node.js und Webservices

2.6.1 SOAP-Services

2.6.2 REST-Services

2.6.3 XML-Verarbeitung

2.7 Clustering

2.7.1 Methoden und Eigenschaften von cluster

2.7.2 Der Master

2.7.3 Der Worker

2.8 Der Callback-Hölle entfliehen

2.8.1 async

2.8.2 Q

2.9 Auf Herz und Nieren ‒ Node.js-Anwendungen testen

2.9.1 Mocha

2.9.2 Assert & Chai

2.9.3 Sinon

2.9.4 Jasmine

2.9.5 Continuous Test

3 … you run it!

3.1 Eigene Module publizieren

3.1.1 Patterns & Style

3.1.2 Ausführbare Module

3.1.3 Module mit nativen Abhängigkeiten

3.1.4 It works on my machine ‒ Dependency Hell

3.1.5 Veröffentlichung von Modulen

3.2 Private Repositories für npm

3.2.1 reggie

3.2.2 sinopia

3.3 Deployment

3.3.1 Ein eigener Server

3.3.2 Cloud

3.4 Was Node.js antreibt … V8 Engine

3.4.1 Architektur

3.4.2 Die Performance-Tricks

3.5 Logging

3.5.1 debug

3.5.2 winston

3.5.3 Bunyan

3.6 Debugging

3.6.1 Der Node-Debugger

3.6.2 Node-Inspector

3.7 Monitoring

3.7.1 Kommerzielle Monitoring-Services

3.8 Alternativen zu Node.js

3.8.1 Vert.x ‒ die polyglotte JVM-Alternative

Robert Prediger
Ralph Winzinger

Node.js

Professionell hochperformante Software entwickeln

Die Autoren:

Robert Prediger, Wang
Ralph Winzinger, Nürnberg

Alle in diesem Buch enthaltenen Informationen, Verfahren und Darstellungen wurden nach bestem Wissen zusammengestellt und mit Sorgfalt getestet. Dennoch sind Fehler nicht ganz auszuschließen. Aus diesem Grund sind die im vorliegenden Buch enthaltenen Informationen mit keiner Verpflichtung oder Garantie irgendeiner Art verbunden. Autoren und Verlag übernehmen infolgedessen keine juristische Verantwortung und werden keine daraus folgende oder sonstige Haftung übernehmen, die auf irgendeine Art aus der Benutzung dieser Informationen – oder Teilen davon – entsteht.

Ebenso übernehmen Autoren und Verlag keine Gewähr dafür, dass beschriebene Verfahren usw. frei von Schutzrechten Dritter sind. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Buch berechtigt deshalb auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften.

Bibliografische Information der Deutschen Nationalbibliothek: Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

Dieses Werk ist urheberrechtlich geschützt. Alle Rechte, auch die der Übersetzung, des Nachdruckes und der Vervielfältigung des Buches, oder Teilen daraus, vorbehalten. Kein Teil des Werkes darf ohne schriftliche Genehmigung des Verlages in irgendeiner Form (Fotokopie, Mikrofilm oder ein anderes Verfahren) – auch nicht für Zwecke der Unterrichtsgestaltung – reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden.

Lektorat: Brigitte Bauer-Schiewek
Copy editing: Petra Kienle, Fürstenfeldbruck
Herstellung: Irene Weilhart
Umschlagdesign: Marc Müller-Bremer, München, www.rebranding.de
Umschlagrealisation: Stephan Rönigk

ISBN 978-3-446-43722-7
ISBN ePub 978-3-446-44721-9

Verwendete Schriften: SourceSansPro und SourceCodePro (Lizenz)
CSS-Version: 1.0

Font License Zurück zum Impressum

Copyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.

Vorwort

Als Erstes möchten wir uns an dieser Stelle für Ihr Interesse an unserem Buch bedanken und die Gelegenheit nutzen, ein paar Worte über unser Buch zu verlieren. Das heißt, wir wollen uns, die Autoren, kurz vorstellen und unsere Motivation erklären, dieses Buch zu schreiben. Außerdem gibt es natürlich das eine oder andere über den Aufbau und das Format zu sagen, über die enthaltenen Beispiele und über JavaScript.

Über die Autoren …

Es war von Anfang an klar, dass dieses Buch ein Gemeinschaftsprojekt sein soll. JavaScript ‒ und damit auch Node.js ‒ leben mit dem Ruf, keine professionelle Entwicklungsumgebung darzustellen. Insbesondere stößt man in der „Enterprise“-Welt auf diese Meinung. Um das objektiv zu hinterfragen, braucht es aber Beitragende aus beiden Lagern. So sind wir ‒ Robert und Ralph ‒ letztendlich aufeinandergetroffen, der eine seit erstaunlich langer Zeit professionell im Node.js-Umfeld tätig, der andere seit vielen Jahren als Software-Architekt in der Java-Enterprise-Welt unterwegs. Einer, der eine gewisse Erwartungshaltung mitbringt, der andere, der diese Erwartungshaltung mit den richtigen Bibliotheken, Tools und Methoden adressieren muss. Für uns war es eine fruchtbare Zusammenarbeit und bedeutete obendrein noch großen Spaß. Wir hoffen, beides in den kommenden Kapiteln weitergeben zu können.

Robert Prediger

Ich bin Robert, der Node.js-Freak. Mein größtes Projekt vor meiner Node.js-Zeit war die Entwicklung eines Accounting-Systems für internationale Hotelketten in Progress. Mit der Erstellung von Webapplikationen beschäftige ich mich seit gut 15 Jahren.

Vor knapp vier Jahren bin ich auf Node.js gestoßen und mich hat die Umgebung von Anfang an, vor allem aufgrund ihrer Stabilität und Geschwindigkeit, überzeugt und fasziniert. Mittlerweile sind diverse Projekte mit Node.js im Rahmen meiner web4biz Consulting ans Laufen gebracht worden.

Seit kurzem bin ich als Co-Founder an der whogloo Inc. beteiligt, deren Ziel es ist, eine Plattform zur Erstellung von Enterprise-Business-Applikationen zu erstellen ‒ auf Basis von Node.js natürlich.

So habe ich in meinem täglichen Umfeld permanent mit Node.js zu tun. Das ist anstrengend, denn die Technik ist nach wie vor neu, teilweise bereits den Kinderschuhen entwachsen, dennoch sehr lernintensiv, wenn man permanent auf dem Laufenden bleiben will. Und das muss man auch, denn die Entwicklung in diesem Umfeld ist rasend schnell. Aber bereut habe ich es bisher nicht, mich komplett auf Node.js einzulassen. Es macht immer wieder Spaß und es fasziniert stets aufs Neue, mit welch teilweise einfachen Mitteln man Programme entwickeln kann, die auch einem hohen Standard genügen.

Und ich bin gespannt, wo uns die Reise mit Node.js noch hinführt.

Ralph Winzinger

Ich bin Ralph, der Java-Architekt. Ich arbeite für Senacor Technologies, ein Beratungsunternehmen mit vielen großen Kunden aus der Finanzwelt, bei denen ich Architekturen geplant, Entwicklungsprozesse eingeführt und Software erstellt habe, gerne auch mal auf der Frontend-Seite, aber hauptsächlich im Backend. EJBs, Webservices, Spring, JPA … das ist in der Regel meine Welt. Und zugegeben, ein großer Freund von JavaScript war ich lange Zeit nicht. Ich glaube, mich noch ungefähr an meine erste Reaktion auf Node.js erinnern zu können: „Serverside JavaScript? Wer braucht denn bitte eine Alert-Box auf dem Server?!?“ Wie gesagt, das war die allererste, spontane Reaktion.

Ich bin aber nicht mit der Java-Enterprise-Welt verheiratet. Es macht mir Spaß, neue Technologien zu ergründen und mir so manche Nacht mit Sourcecode um die Ohren zu schlagen. So ist es nicht verwunderlich, dass mich der Charakter von Node.js bald fasziniert hat.

„High-Scalability“ ist ein Thema, das auch im Enterprise-Umfeld immer wichtiger wird. Eine riesige Zahl von mobilen Endgeräten, die in jeder Branche zu einem extrem wichtigen Kundenkanal geworden sind, und die Entwicklung im Feld von „Internet of Things“ verbieten es geradezu, sich weiter exklusiv auf traditionelle Java Application Container und die damit verbundenen Technologien zu verlassen.

Ob sich ausgerechnet Node.js in meinen Projekten und bei meinen Kunden jemals etablieren wird, ist derzeit noch schwer zu beurteilen. Aber den Konzepten von Node.js wird sich unsere Branche sicherlich nicht verschließen können. Und ich hätte nun meine Meinung zum professionellen Einsatz von JavaScript.

… ihre Helfer …

Zum Buch haben nur wir beide beigetragen? Nein. Eigentlich sollten vier Namen auf dem Cover stehen. Zwei geschätzte Kollegen und sehr gute Freunde haben diese Erkundungstour mit uns gestartet. Teils aus privaten, teils aus beruflichen Gründen mussten aber beide unser Buchprojekt verlassen, bevor wir es zum Abschluss bringen konnten. Trotzdem haben sie wichtige Impulse gegeben und auch wichtige Inhalte beigetragen. Wir sprechen von Victor Volle und Charles-Tom Kalleppally, beide in der Java-Welt verwurzelt, sehr versiert im Umgang mit Architektur, Design und Code und ebenfalls immer bereit, ausgetretene Pfade zu verlassen und sich auch mal neuen Technologien zuzuwenden.

An dieser Stelle großen Dank an Victor und Charly!

… und ihre Motivation

Unsere Motivation haben wir in den einleitenden Sätzen ja schon skizziert: Der Node.js-Mensch wollte eine Lanze für seine Technologie brechen und der Java-Mensch „mal was Verrücktes tun“ ‒ mit dem Ziel, die Entwicklung mit Node.js und JavaScript ein wenig ins rechte Licht zu rücken.

Wir haben die Maßstäbe aus der Java-Enterprise-Entwicklung Node.js und JavaScript angewandt, sowohl technisch als auch methodisch. Toolunterstützung für eine effiziente Arbeitsweise, Qualitätssicherung, um höchsten Ansprüchen zu genügen, State-of-the-Art Deployment und Monitoring … all das haben wir uns angesehen und die aus unserer Sicht und zum aktuellen Zeitpunkt besten oder vielversprechendsten Ansätze aus dem Node.js-Umfeld zusammengetragen.

Wir sind der Meinung, dass es für Node.js oder verwandte Technologien auch im Enterprise-Umfeld Bedarf gibt und dass sich Node hier durchaus verwenden lässt. Nichtsdestotrotz bleibt es zu einem gewissen Teil vorerst noch Kopfsache, ob man Node.js und JavaScript das nötige Vertrauen schenkt, geschäftskritische Teile der Systemlandschaft zu realisieren.

Das Zielpublikum

Wir richten uns mit diesem Buch ganz klar an Entwickler und entwickelnde Architekten. Es ist ein sehr technisches Buch und wir gehen an vielen Stellen davon aus, dass entsprechendes Wissen vorhanden ist, um den einen oder anderen Sachverhalt zu verstehen.

Es werden vor allem diejenigen Freude am Buch haben, die nicht einfach nur möglichst viel Code in möglichst kurzer Zeit produzieren wollen. Das Design des Codes, die Paradigmen der Laufzeitumgebung, aber auch der Betrieb von Enterprise-Software sind uns wichtig und sollten es auch unseren Lesern sein.

Und nicht zuletzt wünschen wir uns ein wenig Spieltrieb. JavaScript ist eine sehr flexible Sprache, Node.js ein sehr schnell wachsendes Ökosystem, in dem es immer wieder Neues zu entdecken gibt. Man kann es sich hier noch viel weniger leisten, den Blick für die aktuelle Entwicklung und aktuelle Trends zu verlieren, als das im eher trägen Enterprise-Umfeld der Fall ist.

Die Arbeit mit JavaScript, mit seinem dynamischen Typsystem und den offenen Sourcecodes führt auch ganz natürlich dazu, dass man sich immer wieder in den Tiefen von fremdem Code verliert, um herauszufinden, wie eine Bibliothek funktioniert, welche versteckten Optionen eine Funktion eventuell noch bietet.

Das alles muss man mögen. Wir mögen es und wir hoffen, unsere Leser ebenfalls.

Das Buch

Es ist nicht nur wichtig, wer ein Buch verfasst hat und weshalb ein Buch geschrieben wurde. Nachdem wir einen bestimmten internen Aufbau verfolgt haben und auch über die verwendete Formatierung die Verständlichkeit erhöhen wollten, möchten wir unsere Richtlinien an dieser Stelle kurz skizzieren.

Aufbau

Wir haben unser Buch in drei Teile gegliedert.

Der erste Teil soll dafür sorgen, dass sich unsere Leser langsam an die Welt von Node.js gewöhnen. Die Geschichte, die Idee, das Tooling stehen hier im Vordergrund. Die Entwicklung an sich ist noch kein Thema, allenfalls am Rande.

Im zweiten und weitaus größten Teil bewegen wir uns durch die Schichten und Problemfelder einer Enterprise-Anwendung. Angefangen beim Dateisystem über Webanwendungen und Service-Schnittstellen bis hin zu einer ausgefeilten Testunterstützung werden die typischen Fragestellungen anhand von vielen vorgestellten Modulen und Codebeispielen beantwortet.

Der letzte Teil kümmert sich im Wesentlichen um die Zeit nach der Entwicklung. Wie nehme ich eine solche Anwendung in Betrieb und wie halte ich sie in Betrieb? Deployment, Monitoring oder auch Performance sind die Themen in diesem Teil. Und nicht zuletzt ein Blick auf eine Alternative ‒ ähnliche Konzepte und Performance, aber nicht (nur) JavaScript.

Formate

Bezüglich der verwendeten Formate haben wir uns zurückgehalten. Natürlich sind alle coderelevanten Passagen als solche zu erkennen. Schreiben wir beispielsweise im Text über Code, so ist das wie hier console.log(„this is code“) entsprechend gekennzeichnet. Längere Codepassagen sind natürlich nicht im Fließtext untergebracht, sondern erhalten ihren eigenen Abschnitt:

var fs = require(„fs“); var i = 5; console.log(„this is still code“)

Auf dieselbe Art sind auch Kommandozeileninteraktionen formatiert. Auch diese können im Fließtext (npm install express) oder in einem größeren Block zu finden sein.

$ node app.js INFO: this is some console output

Und dann sind da noch Modulangaben. Beziehen wir uns im Text auf Module wie Express oder restify, so sind diese immer kursiv dargestellt. Manchmal gibt es in diesem Zusammenhang auch eine gewisse Grauzone. So kann es sein, dass man von dem Modul npm spricht oder aber von dem Kommando npm. Damit ist dasselbe Wort dann vielleicht auch im selben Abschnitt verschieden formatiert.

Beispiele

Die allermeisten unserer Beispiele sind tatsächlich funktionierender Code, der seine Korrektheit zunächst in einem Test oder wenigstens durch eine Ausführung unter Beweis stellen musste. Erst dann durfte er aus der IDE über copy & paste ins Buch springen. Natürlich können auch dabei immer wieder mal Fehler passieren, die bitten wir zu entschuldigen.

Die Codebeispiele

Die Codebeispiele in diesem Buch müssen natürlich nicht abgetippt werden; sie stehen Ihnen online auf einem GitHub Repository zur Verfügung:

https://github.com/WinzingerPrediger/node.js

Die Welt von JavaScript

Eines liegt uns noch sehr am Herzen. Wie erwähnt, ist die Welt von JavaScript und Node.js sehr kurzlebig. Ein Modul, das heute noch das Modul für eine bestimmte Problemstellung ist, wird morgen vielleicht schon von einem neuen Modul abgelöst, welches riesigen Zuspruch in der Community erhält und schnell zum De-facto-Standard wird.

Natürlich stellen wir im Buch ganz konkrete Module vor und laufen damit potenziell Gefahr, dass diese einige Monate nach dem Erscheinungstermin des Buchs schon nicht mehr existieren oder niemanden mehr interessieren. Wir haben aber auch immer versucht, die aus unserer Sicht relevante Funktionalität herauszustellen ‒ welches Problem wird von dem Modul eigentlich gelöst? Mit diesen Hintergrundinformationen sollte es einfacher sein, die Eignung neuer Module zu hinterfragen oder gezielt nach Alternativen zu suchen.

„Lerne ich hier JavaScript?“

Diese Frage lässt sich einfach beantworten: nein. Vielleicht kann man sich an der einen oder anderen Stelle einen kleinen Kniff abschauen, aber wir geben hier noch nicht mal eine gezielte Einführung in JavaScript.

Es gibt sehr viel Literatur und sehr viele Quellen im Internet, die das leisten können. Wir haben uns das nicht zum Ziel gesetzt.

Viel Spaß beim Lesen, Lernen und Spielen,

Robert und Ralph

1Hello, Node.js