Inhaltsverzeichnis

Alle Kapitel aufklappen
Alle Kapitel zuklappen
Geleitwort des Fachgutachters
19
Vorwort
21
1 Grundlagen
25
1.1 Die Geschichte von Node.js
26
1.1.1 Die Ursprünge
26
1.1.2 Die Geburt von Node.js
27
1.1.3 Der Durchbruch von Node.js
28
1.1.4 Node.js erobert Windows
29
1.1.5 io.js – der Fork von Node.js
29
1.1.6 Node.js wieder vereint
30
1.2 Vorteile von Node.js
30
1.3 Einsatzgebiete von Node.js
31
1.4 Das Herzstück – die V8-Engine
32
1.4.1 Das Speichermodell
33
1.4.2 Zugriff auf Eigenschaften
34
1.4.3 Maschinencodegenerierung
36
1.4.4 Garbage Collection
37
1.5 Bibliotheken um die Engine
39
1.5.1 Eventloop
40
1.5.2 Eingabe und Ausgabe
41
1.5.3 libuv
42
1.5.4 DNS
43
1.5.5 Crypto
44
1.5.6 Zlib
44
1.5.7 HTTP-Parser
45
1.6 Zusammenfassung
45
2 Installation
47
2.1 Installation von Paketen
48
2.1.1 Linux
49
2.1.2 Windows
52
2.1.3 OS X
57
2.2 Kompilieren und Installieren
63
2.3 Zusammenfassung
65
3 Ein erstes Beispiel
67
3.1 Der interaktive Modus
67
3.1.1 Generelle Benutzung
67
3.1.2 Zusätzliche REPL-Befehle
69
3.1.3 Speichern und Laden im REPL
70
3.1.4 Kontext der REPL
71
3.1.5 REPL-Historie
71
3.1.6 REPL-Modus
72
3.2 Die erste Applikation
72
3.2.1 Ein Webserver in Node.js
73
3.2.2 Erweiterung des Webservers
76
3.2.3 Erstellen einer HTML-Antwort
78
3.2.4 Dynamische Antworten generieren
79
3.3 Zusammenfassung
81
4 Node-Module
83
4.1 Modularer Ansatz
83
4.2 Stabilität
86
4.2.1 Stabilitätsindex
86
4.2.2 Verfügbare Module
87
4.3 Basis-Module
90
4.3.1 Globale Objekte
90
4.3.2 Utility
93
4.3.3 Events
95
4.3.4 OS
97
4.3.5 Path
97
4.4 Eigene Module erstellen und einbinden
98
4.4.1 Eigene Module in Node.js
98
4.4.2 Eigene Node.js-Module
99
4.4.3 Verschiedene Datentypen exportieren
101
4.4.4 Das modules-Modul
102
4.4.5 Der Modulloader
104
4.4.6 Die »require«-Funktionalität
107
4.5 Zusammenfassung
108
5 NPM
109
5.1 Pakete suchen
109
5.1.1 Pakete installieren
110
5.1.2 Installierte Pakete anzeigen
114
5.1.3 Pakete verwenden
115
5.1.4 Pakete aktualisieren
116
5.1.5 Pakete entfernen
117
5.1.6 Die wichtigsten Kommandos im Überblick
118
5.1.7 Der Aufbau eines Moduls
119
5.1.8 Eigene Pakete erstellen
123
5.1.9 NPM Scripts
125
5.2 Werkzeuge für NPM
126
5.2.1 Node License Finder
126
5.2.2 Sinopia
127
5.3 Zusammenfassung
128
6 ECMAScript 6
129
6.1 Ein kurzer Rückblick
129
6.1.1 Die wichtigsten ES5 Features
130
6.2 Node.js und ECMAScript 6
131
6.3 String- und Array-Erweiterungen
132
6.4 Scoping
133
6.4.1 Gültigkeitsbereiche in JavaScript
133
6.4.2 Module Scope in Node.js
134
6.4.3 Block Scoping
134
6.4.4 Konstante Werte
136
6.4.5 Function in Blocks
136
6.5 Klassen
137
6.5.1 Eine Klasse definieren
137
6.5.2 Vererbung
139
6.6 Template Strings
140
6.6.1 Standard Template Strings
140
6.6.2 Tagged Template Strings
141
6.7 Collections
142
6.7.1 Map
142
6.7.2 Set
143
6.7.3 WeakMaps und WeakSets
143
6.8 Arrow Functions
144
6.9 Generators
145
6.10 Promises
146
6.11 Symbols
148
6.12 Typed Arrays
150
6.13 Spread-Operator
150
6.14 Rest Parameters
151
6.15 Destructuring
151
6.16 Binary und Octal Literals
152
6.17 Erweiterung der Object Literals
152
6.18 »Object.assign«
153
6.19 »new.target«
153
6.20 Zusammenfassung
153
7 Node auf der Kommandozeile
155
7.1 Grundlagen
155
7.1.1 Aufbau
156
7.1.2 Ausführbarkeit
157
7.2 Der Aufbau einer Kommandozeilenapplikation
158
7.2.1 Datei und Verzeichnisstruktur
159
7.2.2 Paketdefinition
160
7.3 Zugriff auf Ein- und Ausgabe
161
7.3.1 Ausgabe
161
7.3.2 Eingabe
162
7.3.3 Optionen und Argumente
164
7.3.4 Signale und Exit Codes
166
7.4 Werkzeuge
169
7.4.1 Commander.js
169
7.4.2 Chalk
171
7.5 Zusammenfassung
172
8 HTTP
173
8.1 Der Webserver
173
8.1.1 Das »Server«-Objekt
173
8.1.2 Server-Events
175
8.1.3 Das »Request«-Objekt
177
8.1.4 Das »Response«-Objekt
180
8.1.5 Ausliefern von HTML
184
8.1.6 Ausliefern von statischen Dateien
184
8.1.7 Umgang mit »GET« und »POST«
185
8.1.8 Dateiupload
186
8.2 HTTP-Client mit Node.js
187
8.2.1 Die »get«-Methode
188
8.2.2 Der »http.Agent«
188
8.2.3 Die Anfrage-Optionen
189
8.2.4 Die Klasse »ClientRequest«
191
8.2.5 Die Antwort des Servers
193
8.2.6 HTML-Parser
195
8.3 Umgang mit URLs
196
8.4 Sichere Kommunikation mit HTTPS
198
8.5 Zusammenfassung
199
9 Express.js
201
9.1 Aufbau
201
9.2 Installation
203
9.3 Grundlagen
204
9.3.1 »Request«
204
9.3.2 »Response«
205
9.4 Setup
206
9.4.1 Verzeichnisstruktur
207
9.4.2 Router
210
9.4.3 Controller
211
9.4.4 Models
212
9.4.5 View
213
9.5 Routing
215
9.5.1 HTTP-Methoden
215
9.5.2 Muster in Routen
216
9.5.3 Variablen in Routen
217
9.5.4 Routing-Callbacks
218
9.5.5 »Route«-Objekt
219
9.5.6 Das »Router«-Objekt
220
9.6 Middleware
220
9.6.1 Eigene Middleware
221
9.6.2 Morgan
222
9.6.3 Serve-static
223
9.6.4 Body-Parser
224
9.7 Zusammenfassung
227
10 Template-Engines
229
10.1 Eine eigene Template-Engine
230
10.2 Template-Engines in der Praxis – Jade
231
10.2.1 Installation und grundsätzliche Verwendung
232
10.2.2 Jade und Express.js
233
10.2.3 Variablen in Jade
236
10.2.4 Die Besonderheiten von Jade
238
10.2.5 Bedingungen und Schleifen
242
10.2.6 Extends und Includes
245
10.2.7 Mixins
248
10.2.8 Compiling
250
10.3 Handlebars
251
10.3.1 Installation und erstes Beispiel
251
10.3.2 Bedingungen und Schleifen
253
10.3.3 Partials
254
10.3.4 Eigene Helper
255
10.3.5 Integration in Express.js
256
10.4 Zusammenfassung
258
11 REST Server
259
11.1 »GET« – lesender Zugriff
261
11.2 »POST« – Anlegen neuer Ressourcen
265
11.3 »PUT« – Aktualisierung bestehender Daten
267
11.4 »DELETE« – Löschen vorhandener Daten
269
11.5 »Accept«-Header
271
11.6 Zusammenfassung
273
12 Single-Page-Webapplikationen mit Express.js und Angular.js
275
12.1 Die Aufgabenstellung
275
12.2 Setup
276
12.2.1 Ordnerstruktur
276
12.2.2 Die Datenbank
277
12.2.3 Abhängigkeiten
277
12.2.4 Clientbibliotheken
278
12.3 Die Applikation
281
12.3.1 Liste von Datensätzen
282
12.3.2 Anlegen neuer Datensätze
289
12.3.3 Datensätze verändern
293
12.3.4 Löschen von Datensätzen
297
12.4 Zusammenfassung
299
13 Echtzeit-Webapplikationen
301
13.1 Die Beispielapplikation
302
13.2 Setup
303
13.3 Websockets
308
13.3.1 Die Serverseite
309
13.3.2 Die Clientseite
312
13.3.3 Userliste
314
13.3.4 Logout
319
13.4 Socket.IO
320
13.4.1 Installation und Einbindung
321
13.4.2 Socket.IO-API
321
13.5 Zusammenfassung
325
14 Asynchrone Programmierung
327
14.1 Grundlagen asynchroner Programmierung
327
14.1.1 Das child_process-Modul
330
14.2 Externe Kommandos asynchron ausführen
332
14.2.1 Die »exec«-Methode
332
14.2.2 Die »spawn«-Methode
335
14.3 »fork«
337
14.4 Das cluster-Modul
341
14.4.1 Der Masterprozess
342
14.4.2 Die Workerprozesse
346
14.5 Promises in Node.js
349
14.5.1 Flusssteuerung mit Promises
351
14.6 Zusammenfassung
353
15 Streams
355
15.1 Einleitung
355
15.1.1 Was ist ein Stream?
355
15.1.2 Wozu verwendet man Streams?
356
15.1.3 Welche Streams gibt es?
357
15.1.4 Stream-Versionen in Node.js
357
15.1.5 Streams sind EventEmitter
358
15.2 Readable Streams
358
15.2.1 Einen Readable Stream erstellen
359
15.2.2 Die Readable-Stream-Schnittstelle
360
15.2.3 Die Events eines Readable Streams
361
15.2.4 Fehlerbehandlung in Readable Streams
362
15.2.5 Methoden
363
15.2.6 Piping
363
15.2.7 Readable-Stream-Modi
364
15.2.8 Wechsel in den Flowing Mode
364
15.2.9 Wechsel in den Paused Mode
365
15.2.10 Eigene Readable Streams
365
15.2.11 Beispiel für einen Readable Stream
366
15.2.12 Readable-Shortcut
368
15.3 Writable Streams
369
15.3.1 Einen Writable Stream erstellen
369
15.3.2 Die Writable-Stream-Schnittstelle
370
15.3.3 Events
370
15.3.4 Fehlerbehandlung in Writable Streams
372
15.3.5 Methoden
372
15.3.6 Schreiboperationen puffern
373
15.3.7 Flusssteuerung
374
15.3.8 Eigene Writable Streams
375
15.3.9 Writable-Shortcut
376
15.4 Duplex Streams
376
15.4.1 Duplex Streams im Einsatz
377
15.4.2 Eigene Duplex Streams
377
15.4.3 Duplex-Shortcut
378
15.5 Transform Streams
378
15.5.1 Eigene Transform Streams
379
15.5.2 Transform-Shortcut
380
15.6 Gulp
380
15.6.1 Installation
381
15.6.2 Beispiel für einen Build-Prozess mit Gulp
381
15.7 Zusammenfassung
382
16 Arbeiten mit Dateien
383
16.1 Synchrone und asynchrone Funktionen
383
16.2 Existenz von Dateien
384
16.3 Dateien lesen
385
16.4 Fehlerbehandlung
390
16.5 In Dateien schreiben
391
16.6 Verzeichnisoperationen
394
16.7 Weiterführende Operationen
398
16.7.1 »watch«
400
16.7.2 Zugriffsberechtigungen
401
16.8 Zusammenfassung
402
17 Socket-Server
405
17.1 UNIX-Sockets
406
17.1.1 Zugriff auf den Socket
408
17.1.2 Bidirektionale Kommunikation
410
17.2 Windows Pipes
413
17.3 TCP-Sockets
414
17.3.1 Datenübertragung
416
17.3.2 Dateiübertragung
417
17.3.3 Flusssteuerung
418
17.3.4 Duplex
420
17.3.5 Pipe
420
17.4 UDP-Sockets
421
17.4.1 Grundlagen eines UDP-Servers
422
17.4.2 Beispiel zum UDP-Server
424
17.5 Zusammenfassung
426
18 Anbindung von Datenbanken
427
18.1 Node.js und relationale Datenbanken
428
18.1.1 MySQL
428
18.1.2 SQLite
434
18.2 Node.js und nicht relationale Datenbanken
439
18.2.1 Redis
440
18.2.2 MongoDB
444
18.3 Datenbanken und Promises
449
18.4 Datenbanken und Streams
450
18.5 Zusammenfassung
451
19 Qualitätssicherung
453
19.1 Unittesting
453
19.1.1 Verzeichnisstruktur
454
19.1.2 Unittests und Node.js
455
19.1.3 Tripple-A
455
19.2 Assertion Testing
456
19.3 Jasmine
459
19.3.1 Installation
460
19.3.2 Konfiguration
460
19.3.3 Tests in Jasmine
461
19.3.4 Assertions
462
19.3.5 Spies
464
19.3.6 »beforeEach« und »afterEach«
465
19.4 nodeunit
465
19.4.1 Installation
465
19.4.2 Ein erster Test
466
19.4.3 Assertions
468
19.4.4 Gruppierung
468
19.4.5 »setUp« und »tearDown«
470
19.5 Praktisches Beispiel von Unittests mit nodeunit
470
19.5.1 Der Test
471
19.5.2 Die Implementierung
472
19.5.3 Der zweite Test
472
19.5.4 Verbesserung der Implementierung
473
19.6 Statische Codeanalyse
474
19.6.1 ESLint
475
19.6.2 PMD CPD
478
19.6.3 Plato
480
19.7 Node.js Debugger
482
19.7.1 Navigation im Debugger
483
19.7.2 Informationen im Debugger
484
19.7.3 Breakpoints
486
19.8 Node Inspector
487
19.8.1 Installation
488
19.8.2 Features
488
19.9 Debugging in der Entwicklungsumgebung
489
19.10 Zusammenfassung
489
20 Sicherheitsaspekte
491
20.1 Filter Input und Escape Output
492
20.1.1 Filter Input
492
20.1.2 Black- und Whitelisting
492
20.1.3 Escape Output
493
20.2 Absicherung des Servers
494
20.2.1 Benutzerberechtigungen
495
20.2.2 Single-Threaded-Ansatz
496
20.2.3 Denial of Service
499
20.2.4 Reguläre Ausdrücke
500
20.2.5 HTTP-Header
501
20.2.6 Fehlermeldungen
504
20.2.7 SQL-Injections
504
20.2.8 »eval«
506
20.2.9 Method Invocation
508
20.2.10 Überschreiben von Built-ins
510
20.3 NPM-Sicherheit
511
20.3.1 Berechtigungen
512
20.3.2 Qualitätsaspekt
512
20.3.3 NPM Scripts
513
20.4 Schutz des Clients
514
20.4.1 Cross-Site-Scripting
515
20.4.2 Cross-Site-Request-Forgery
516
20.5 Zusammenfassung
518
21 Skalierbarkeit und Deployment
519
21.1 Deployment
519
21.1.1 Einfaches Deployment
520
21.1.2 Dateisynchronisierung mit rsync
521
21.1.3 Die Applikation als Dienst
522
21.1.4 node_modules beim Deployment
525
21.1.5 Applikationen mit dem Node Package Manager installieren
526
21.1.6 Pakete lokal installieren
527
21.2 Toolunterstützung
528
21.2.1 Grunt
528
21.2.2 Gulp
533
21.2.3 NPM
534
21.3 Skalierung
534
21.3.1 Kindprozesse
535
21.3.2 Loadbalancer
538
21.3.3 Node in der Cloud
541
21.4 pm2 – Prozessmanagement
543
21.5 Zusammenfassung
544
Index
545