Inhaltsverzeichnis

Alle Kapitel aufklappen
Alle Kapitel zuklappen
Materialien zum Buch
21
Geleitwort
23
Vorwort
25
1 Grundlagen
29
1.1 Die Geschichte von Node.js
31
1.1.1 Die Ursprünge
31
1.1.2 Die Geburt von Node.js
32
1.1.3 Der Durchbruch von Node.js
33
1.1.4 Node.js erobert Windows
34
1.1.5 io.js – der Fork von Node.js
34
1.1.6 Node.js wieder vereint
35
1.2 Die Organisation von Node.js
35
1.2.1 Das Technical Steering Committee
35
1.2.2 Collaborators
35
1.2.3 Das Community Committee
36
1.2.4 Arbeitsgruppen
36
1.2.5 Die Node.js Foundation
36
1.3 Versionierung von Node.js
37
1.3.1 LTS-Releases
37
1.4 Vorteile von Node.js
38
1.5 Einsatzgebiete von Node.js
39
1.6 Das Herzstück – die V8-Engine
40
1.6.1 Das Speichermodell
41
1.6.2 Zugriff auf Eigenschaften
41
1.6.3 Maschinencodegenerierung
44
1.6.4 Garbage Collection
45
1.7 Bibliotheken um die Engine
47
1.7.1 Event-Loop
48
1.7.2 Eingabe und Ausgabe
49
1.7.3 libuv
50
1.7.4 DNS
51
1.7.5 Crypto
52
1.7.6 Zlib
52
1.7.7 HTTP-Parser
53
1.8 Zusammenfassung
53
2 Installation
55
2.1 Installation von Paketen
56
2.1.1 Linux
57
2.1.2 Windows
61
2.1.3 macOS
65
2.2 Kompilieren und installieren
70
2.3 Node Version Manager
73
2.4 Zusammenfassung
74
3 Ein erstes Beispiel
75
3.1 Der interaktive Modus
75
3.1.1 Generelle Benutzung
76
3.1.2 Weitere REPL-Befehle
77
3.1.3 Speichern und Laden im REPL
79
3.1.4 Kontext des REPL
79
3.1.5 REPL-Historie
80
3.1.6 REPL-Modus
80
3.2 Die erste Applikation
81
3.2.1 Ein Webserver in Node.js
81
3.2.2 Erweiterung des Webservers
85
3.2.3 Erstellen einer HTML-Antwort
87
3.2.4 Dynamische Antworten generieren
88
3.3 Debuggen von Node.js-Applikationen
90
3.3.1 Navigation im Debugger
92
3.3.2 Informationen im Debugger
93
3.3.3 Breakpoints
95
3.3.4 Debuggen mit den Chrome Developer Tools
98
3.3.5 Debugging in der Entwicklungsumgebung
100
3.4 Entwicklungswerkzeug »nodemon«
101
3.5 Zusammenfassung
102
4 Node.js-Module
103
4.1 Modularer Aufbau
103
4.2 Kernmodule
105
4.2.1 Stabilität
106
4.2.2 Liste der Kernmodule
108
4.2.3 Globale Objekte
110
4.3 JavaScript-Modulsysteme
117
4.3.1 CommonJS
118
4.3.2 ECMAScript-Module
119
4.4 Eigene Module erzeugen und verwenden
121
4.4.1 Module in Node.js
122
4.4.2 Eigene Node.js-Module
123
4.4.3 Verschiedene Datentypen exportieren
125
4.4.4 Das »modules«-Modul
127
4.4.5 Der Modulloader
128
4.4.6 Die »require«-Funktionalität
131
4.5 Zusammenfassung
133
5 HTTP
135
5.1 Der Webserver
135
5.1.1 Das »Server«-Objekt
135
5.1.2 Server-Events
140
5.1.3 Das »Request«-Objekt
142
5.1.4 Umgang mit dem Request-Body (Update)
148
5.1.5 Ausliefern von statischen Inhalten
153
5.1.6 Dateiupload
154
5.2 Node.js als HTTP-Client
157
5.2.1 Requests mit dem »http«-Modul
157
5.2.2 Das »request«-Paket
158
5.2.3 HTML-Parser
160
5.3 Sichere Kommunikation mit HTTPS
161
5.3.1 Zertifikate erstellen
161
5.3.2 HTTPS im Webserver verwenden
162
5.4 HTTP/2
163
5.4.1 Der HTTP/2-Server
164
5.4.2 Server-Push
166
5.4.3 Der HTTP/2-Client
168
5.5 Zusammenfassung
170
6 Express
171
6.1 Aufbau
171
6.2 Installation
172
6.3 Grundlagen
174
6.3.1 Request
174
6.3.2 Response
175
6.4 Setup
176
6.4.1 Struktur einer Applikation
176
6.5 Moviedatenbank
179
6.5.1 Routing
180
6.5.2 Controller
183
6.5.3 Model
184
6.5.4 View
185
6.6 Middleware
187
6.6.1 Eigene Middleware
187
6.6.2 Morgan
189
6.6.3 Statische Inhalte ausliefern
190
6.7 Erweitertes Routing – Löschen von Datensätzen
192
6.8 Anlegen und Bearbeiten von Datensätzen – Body-Parser
195
6.8.1 Umgang mit Formulareingaben – Body-Parser
199
6.9 Express 5
202
6.10 HTTPS und HTTP/2
203
6.10.1 HTTPS
203
6.10.2 HTTP/2
204
6.11 Zusammenfassung
205
7 Template-Engines
207
7.1 Eine eigene Template-Engine
208
7.2 Template-Engines in der Praxis – Pug
210
7.2.1 Installation
210
7.2.2 Pug und Express.js – Integration
210
7.2.3 Variablen in Pug
214
7.2.4 Die Besonderheiten von Pug
215
7.2.5 Bedingungen und Schleifen
216
7.2.6 Extends und Includes
218
7.2.7 Mixins
221
7.2.8 Pug unabhängig von Express verwenden
223
7.2.9 Compiling
223
7.3 Handlebars
225
7.3.1 Installation
225
7.3.2 Integration in Express.js
225
7.3.3 Bedingungen und Schleifen
228
7.3.4 Partials
229
7.3.5 Eigene Helper
231
7.3.6 Handlebars ohne Express
233
7.4 Zusammenfassung und Ausblick
234
8 Anbindung von Datenbanken
237
8.1 Node.js und relationale Datenbanken
238
8.1.1 MySQL
238
8.1.2 SQLite
252
8.1.3 ORM
259
8.2 Node.js und nicht relationale Datenbanken
261
8.2.1 Redis
261
8.2.2 MongoDB
267
8.3 Zusammenfassung
276
9 Authentifizierung und Sessionhandling
277
9.1 Passport
277
9.2 Setup und Konfiguration
278
9.2.1 Installation
278
9.2.2 Konfiguration
278
9.2.3 Konfiguration der Strategy
280
9.3 Anmeldung an der Applikation
281
9.3.1 Anmeldeformular
282
9.3.2 Absicherung von Ressourcen
284
9.3.3 Abmelden
285
9.3.4 Anbindung an die Datenbank
286
9.4 Zugriff auf Ressourcen
289
9.4.1 Zugriffsbeschränkung
290
9.4.2 Bewertungen abgeben
295
9.5 Zusammenfassung
300
10 REST-Server
301
10.1 REST – eine kurze Einführung und wie es in Webapplikationen verwendet wird
301
10.2 Zugriff auf die Applikation
302
10.2.1 Postman
302
10.2.2 cURL
303
10.3 Anpassungen an der Applikationsstruktur
303
10.4 Lesende Anfragen
304
10.4.1 Alle Datensätze einer Ressource auslesen
305
10.4.2 Zugriff auf einen Datensatz
307
10.4.3 Fehlerbehandlung
309
10.4.4 Sortieren der Liste
310
10.4.5 Steuern des Ausgabeformats
313
10.5 Schreibende Anfragen
315
10.5.1 POST – Erstellen von neuen Datensätzen
315
10.5.2 PUT – Bestehende Datensätze modifizieren
319
10.5.3 DELETE – Datensätze löschen
322
10.6 Authentifizierung mit JWT
323
10.6.1 Anmeldung
324
10.6.2 Absichern von Ressourcen
326
10.6.3 Zugriff auf Benutzerinformationen im Token
327
10.7 Swagger
328
10.8 GraphQL
333
10.8.1 Integration in Express
333
10.9 Zusammenfassung
338
11 Echtzeit-Webapplikationen
339
11.1 Die Beispielapplikation
340
11.2 Setup
341
11.3 Websockets
347
11.3.1 Die Serverseite
348
11.3.2 Die Clientseite
352
11.3.3 User-Liste
354
11.3.4 Logout
358
11.4 Socket.IO
362
11.4.1 Installation und Einbindung
362
11.4.2 Socket.IO-API
364
11.5 Zusammenfassung
367
12 Node auf der Kommandozeile
369
12.1 Grundlagen
369
12.1.1 Aufbau
370
12.1.2 Ausführbarkeit
371
12.2 Der Aufbau einer Kommandozeilenapplikation
372
12.2.1 Datei und Verzeichnisstruktur
372
12.2.2 Paketdefinition
373
12.2.3 Die Mathe-Trainer-Applikation
374
12.3 Zugriff auf Ein- und Ausgabe
377
12.3.1 Ausgabe
378
12.3.2 Eingabe
379
12.3.3 Benutzerinteraktion mit dem »readline«-Modul
380
12.3.4 Optionen und Argumente
384
12.4 Werkzeuge
387
12.4.1 Commander
387
12.4.2 Chalk
389
12.4.3 node-emoji
391
12.5 Signale
394
12.6 Exit Codes
396
12.7 Zusammenfassung
398
13 Asynchrone Programmierung
399
13.1 Grundlagen asynchroner Programmierung
399
13.1.1 Das »child_process«-Modul
402
13.2 Externe Kommandos asynchron ausführen
404
13.2.1 Die »exec«-Methode
404
13.2.2 Die »spawn«-Methode
407
13.3 Node.js-Kindprozesse erzeugen mit »fork«
410
13.4 Das »cluster«-Modul
414
13.4.1 Der Masterprozess
415
13.4.2 Die Workerprozesse
419
13.5 Promises in Node.js
423
13.5.1 Verkettung von Promises
426
13.5.2 Mehrere parallele Operationen mit »Promise.all«
427
13.5.3 Die schnellste asynchrone Operation mit »Promise.race«
428
13.6 Async Functions
429
13.7 Zusammenfassung
430
14 RxJS
433
14.1 Grundlagen
434
14.1.1 Observable
435
14.1.2 Observer
436
14.1.3 Operator
438
14.1.4 Beispiel für RxJS in Node
438
14.2 Operatoren
440
14.2.1 Erstellende Operatoren
442
14.2.2 Transformierende Operatoren
444
14.2.3 Filteroperatoren
447
14.2.4 Kombinierende Operatoren
450
14.2.5 Operatoren zur Fehlerbehandlung
451
14.2.6 Hilfsoperatoren
453
14.2.7 Bedingungsoperatoren
454
14.2.8 Verbindungsoperatoren
455
14.2.9 Konvertierungsoperator
456
14.3 Subjects
456
14.4 Scheduler
458
14.5 Zusammenfassung
459
15 Streams
461
15.1 Einleitung
461
15.1.1 Was ist ein Stream?
461
15.1.2 Wozu verwendet man Streams?
462
15.1.3 Welche Streams gibt es?
463
15.1.4 Streamversionen in Node.js
463
15.1.5 Streams sind EventEmitter
464
15.2 Readable Streams
464
15.2.1 Einen Readable Stream erstellen
465
15.2.2 Die Readable-Stream-Schnittstelle
466
15.2.3 Die Events eines Readable Streams
467
15.2.4 Fehlerbehandlung in Readable Streams
468
15.2.5 Methoden
469
15.2.6 Piping
470
15.2.7 Readable-Stream-Modi
470
15.2.8 Wechsel in den Flowing Mode
471
15.2.9 Wechsel in den Paused Mode
471
15.2.10 Eigene Readable Streams
472
15.2.11 Beispiel für einen Readable Stream
472
15.2.12 Readable-Shortcut
475
15.3 Writable Streams
476
15.3.1 Einen Writable Stream erstellen
477
15.3.2 Events
477
15.3.3 Fehlerbehandlung in Writable Streams
479
15.3.4 Methoden
479
15.3.5 Schreiboperationen puffern
480
15.3.6 Flusssteuerung
481
15.3.7 Eigene Writable Streams
482
15.3.8 Writable-Shortcut
483
15.4 Duplex-Streams
484
15.4.1 Duplex-Streams im Einsatz
484
15.4.2 Eigene Duplex-Streams
484
15.4.3 Duplex-Shortcut
485
15.5 Transform-Streams
486
15.5.1 Eigene Transform-Streams
486
15.5.2 Transform-Shortcut
487
15.6 Gulp
488
15.6.1 Installation
488
15.6.2 Beispiel für einen Build-Prozess mit Gulp
488
15.7 Zusammenfassung
490
16 Arbeiten mit Dateien
491
16.1 Synchrone und asynchrone Funktionen
491
16.2 Existenz von Dateien
493
16.3 Dateien lesen
494
16.3.1 Die promisebasierte API
499
16.4 Fehlerbehandlung
499
16.5 In Dateien schreiben
500
16.6 Verzeichnisoperationen
504
16.7 Weiterführende Operationen
507
16.7.1 »watch«
509
16.7.2 Zugriffsberechtigungen
510
16.8 Zusammenfassung
512
17 Socket-Server
513
17.1 Unix-Sockets
514
17.1.1 Zugriff auf den Socket
516
17.1.2 Bidirektionale Kommunikation
518
17.2 Windows Pipes
521
17.3 TCP-Sockets
522
17.3.1 Datenübertragung
524
17.3.2 Dateiübertragung
525
17.3.3 Flusssteuerung
527
17.3.4 Duplex
528
17.3.5 Pipe
529
17.4 UDP-Sockets
530
17.4.1 Grundlagen eines UDP-Servers
531
17.4.2 Beispiel zum UDP-Server
532
17.5 Zusammenfassung
534
18 Package Manager
535
18.1 Die häufigsten Operationen
536
18.1.1 Pakete suchen
536
18.1.2 Pakete installieren
537
18.1.3 Installierte Pakete anzeigen
541
18.1.4 Pakete verwenden
542
18.1.5 Pakete aktualisieren
543
18.1.6 Pakete entfernen
545
18.1.7 Die wichtigsten Kommandos im Überblick
546
18.2 Weiterführende Operationen
547
18.2.1 Der Aufbau eines Moduls
547
18.2.2 Eigene Pakete erstellen
550
18.2.3 NPM Scripts
552
18.3 Werkzeuge für NPM
554
18.3.1 Node License Finder
554
18.3.2 Sinopia
555
18.3.3 »npm-check-updates«
556
18.3.4 »npx«
557
18.4 Yarn
557
18.5 Zusammenfassung
558
19 Qualitätssicherung
561
19.1 Styleguides
562
19.1.1 Der Airbnb-Styleguide
562
19.2 Linter
563
19.2.1 ESLint
564
19.3 Prettier
568
19.3.1 Installation
568
19.3.2 Ausführung
568
19.4 PMD CPD
569
19.4.1 Installation
570
19.4.2 Ausführung
571
19.5 Plato
572
19.5.1 Installation
572
19.5.2 Ausführung
572
19.6 Zusammenfassung
574
20 Testing
575
20.1 Unittesting
575
20.1.1 Verzeichnisstruktur
576
20.1.2 Unittests und Node.js
577
20.1.3 Triple-A
577
20.2 Assertion Testing
578
20.2.1 Exceptions
581
20.2.2 Promises testen
582
20.3 Jasmine
584
20.3.1 Installation
585
20.3.2 Konfiguration
585
20.3.3 Tests in Jasmine
586
20.3.4 Assertions
588
20.3.5 Spys
591
20.3.6 »beforeEach« und »afterEach«
592
20.4 »nodeunit«
592
20.4.1 Installation
592
20.4.2 Ein erster Test
593
20.4.3 Assertions
595
20.4.4 Gruppierung
595
20.4.5 »setUp« und »tearDown«
596
20.5 Praktisches Beispiel von Unittests mit »nodeunit«
597
20.5.1 Der Test
598
20.5.2 Die Implementierung
599
20.5.3 Der zweite Test
600
20.5.4 Verbesserung der Implementierung
601
20.6 Zusammenfassung
602
21 Sicherheitsaspekte
605
21.1 »filter input« und »escape output«
606
21.1.1 »filter input«
606
21.1.2 Black- und Whitelisting
606
21.1.3 »escape output«
607
21.2 Absicherung des Servers
609
21.2.1 Benutzerberechtigungen
609
21.2.2 Single-threaded-Ansatz
610
21.2.3 Denial of Service
613
21.2.4 Reguläre Ausdrücke
614
21.2.5 HTTP-Header
616
21.2.6 Fehlermeldungen
618
21.2.7 SQL-Injections
619
21.2.8 »eval«
621
21.2.9 Method Invocation
623
21.2.10 Überschreiben von Built-ins
625
21.3 NPM-Sicherheit
627
21.3.1 Berechtigungen
627
21.3.2 Node Security Platform
628
21.3.3 Qualitätsaspekt
629
21.3.4 NPM Scripts
630
21.4 Schutz des Clients
631
21.4.1 Cross-Site-Scripting
632
21.4.2 Cross-Site-Request-Forgery
633
21.5 Zusammenfassung
635
22 Skalierbarkeit und Deployment
637
22.1 Deployment
637
22.1.1 Einfaches Deployment
638
22.1.2 Dateisynchronisierung mit »rsync«
640
22.1.3 Die Applikation als Dienst
641
22.1.4 »node_modules« beim Deployment
643
22.1.5 Applikationen mit dem Node Package Manager installieren
644
22.1.6 Pakete lokal installieren
645
22.2 Toolunterstützung
646
22.2.1 Grunt
646
22.2.2 Gulp
654
22.2.3 NPM
654
22.3 Skalierung
654
22.3.1 Kindprozesse
656
22.3.2 Loadbalancer
659
22.3.3 Node in der Cloud
662
22.4 »pm2« – Prozessmanagement
664
22.5 Docker
665
22.5.1 Das Dockerfile
665
22.5.2 Container starten
666
22.6 Zusammenfassung
667
23 Microservices mit Node.js
669
23.1 Grundlagen
669
23.1.1 Monolithische Architektur
669
23.1.2 Microservice-Architektur
671
23.2 Architektur
672
23.2.1 Kommunikation zwischen den einzelnen Services
673
23.3 Die Infrastruktur
674
23.3.1 Docker Compose
675
23.4 Seneca
676
23.4.1 Installation und Setup
676
23.4.2 Muster in Seneca
677
23.4.3 Datenbank-Anbindung
679
23.4.4 Seneca-Plugins
680
23.4.5 Transports
681
23.4.6 Kommunikation über eine Message-Queue
682
23.4.7 Docker Setup
683
23.5 API-Gateway
685
23.5.1 Anbindung des User-Services
685
23.5.2 Asynchrone Kommunikation mit dem User-Service
687
23.5.3 Authentifizierung
689
23.5.4 Docker Setup des API-Gateways
691
23.6 Express
693
23.6.1 Setup
694
23.6.2 Controller
694
23.6.3 Model-Implementierung
695
23.6.4 Docker-Setup
697
23.6.5 Einbindung ins API-Gateway
699
23.7 Zusammenfassung
703
24 Typsichere Applikationen in Node.js
705
24.1 Typsysteme für Node.js
706
24.1.1 Flow
706
24.1.2 TypeScript
709
24.2 Werkzeuge und Konfiguration
710
24.2.1 Konfiguration des TypeScript-Compilers
711
24.2.2 Integration in die Entwicklungsumgebung
712
24.2.3 TSLint
712
24.2.4 »ts-node«
713
24.3 Grundlagen
714
24.3.1 Datentypen
715
24.3.2 Funktionen
717
24.3.3 Module
718
24.4 Klassen
720
24.4.1 Methoden
721
24.4.2 Zugriffsmodifikatoren
722
24.4.3 Vererbung
722
24.5 Interfaces
723
24.6 Generics
724
24.7 TypeScript im Einsatz in einer Node.js-Applikation
726
24.7.1 TypeDefinitions
726
24.7.2 Eigene TypeDefinitions erzeugen
726
24.7.3 Beispiel einer Express-Applikation
727
24.8 Zusammenfassung
728
Index
729