Inhaltsverzeichnis

Alle Kapitel aufklappen
Alle Kapitel zuklappen
Materialien zum Buch
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.1.7 Deno – 10 Things I Regret about Node.js
35
1.1.8 Die OpenJS Foundation
36
1.1.9 Bun – die nächste Generation der JavaScript-Runtimes
36
1.2 Die Organisation von Node.js
36
1.3 Versionierung von Node.js
37
1.4 Stärken von Node.js
39
1.5 Einsatzgebiete von Node.js
40
1.6 Die wichtigsten Merkmale von Node.js
41
1.7 Das Herzstück – die V8-Engine
42
1.7.1 Das Speichermodell
43
1.7.2 Zugriff auf Eigenschaften
43
1.7.3 Maschinencodegenerierung
46
1.7.4 Garbage Collection
47
1.8 Bibliotheken um die Engine
49
1.8.1 Event-Loop
50
1.8.2 Eingabe und Ausgabe
51
1.8.3 libuv
52
1.8.4 DNS
53
1.8.5 Crypto
54
1.8.6 Zlib
54
1.8.7 HTTP-Parser
55
1.9 Zusammenfassung
55
2 Installation
57
2.1 Node.js-Versionierung
58
2.2 Installation mit dem Installer
60
2.2.1 Der Installationsprozess
60
2.3 Installation über den Paketmanager des Systems
62
2.4 Einsatz eines Version-Managers
63
2.4.1 Arbeiten mit dem Fast Node Manager
64
2.5 Node.js in einem Container ausführen
68
2.5.1 Warum Node im Container?
69
2.5.2 Welche Container gibt es und was ist im Container enthalten?
70
2.5.3 Einen Node.js-Container interaktiv starten
71
2.5.4 Einen Container für die Entwicklung benutzen
72
2.5.5 Mit dem Container verbinden
76
2.6 Zusammenfassung
77
3 Ein erstes Beispiel
79
3.1 REPL – die interaktive Shell von Node.js
79
3.1.1 Generelle Benutzung
80
3.1.2 Weitere REPL-Befehle
83
3.1.3 Speichern und Laden im REPL
84
3.1.4 Kontext des REPL
85
3.1.5 REPL-Historie
86
3.1.6 REPL-Modus
86
3.1.7 Suche im REPL
87
3.1.8 Asynchrone Operationen im REPL
87
3.2 Die erste Applikation
88
3.2.1 Ein Webserver in Node.js
89
3.2.2 Erweiterung des Webservers
93
3.2.3 Erstellen einer HTML-Antwort
95
3.2.4 Dynamische Antworten generieren
96
3.3 Debuggen von Node.js-Applikationen
99
3.3.1 Navigation im Debugger
101
3.3.2 Informationen im Debugger
101
3.3.3 Breakpoints
104
3.3.4 Debuggen mit den Chrome Developer Tools
107
3.3.5 Debugging in der Entwicklungsumgebung
109
3.4 Entwicklungswerkzeug »nodemon«
110
3.5 Node.js im Watch-Modus
111
3.6 Zusammenfassung
114
4 Node.js-Module
117
4.1 Modularer Aufbau
117
4.2 Kernmodule
120
4.2.1 Stabilität
120
4.2.2 Liste der Kernmodule
123
4.2.3 Laden von Kernmodulen
127
4.2.4 Globale Objekte
130
4.3 JavaScript-Modulsysteme
146
4.3.1 CommonJS
146
4.3.2 ECMAScript-Module
147
4.4 Eigene Module erzeugen und verwenden
151
4.4.1 Module in Node.js – CommonJS
152
4.4.2 Eigene Node.js-Module
153
4.4.3 Module in Node.js – ECMAScript
155
4.4.4 Verschiedene Datentypen exportieren
156
4.4.5 Das »modules«-Modul
157
4.4.6 Der Modulloader
159
4.5 Module dynamisch laden
164
4.6 Zusammenfassung
165
5 HTTP
167
5.1 Das HTTP-Protokoll
167
5.2 Der Webserver
168
5.2.1 Das »Server«-Objekt
168
5.2.2 Server-Events
175
5.2.3 Das »Request«-Objekt
178
5.2.4 Umgang mit dem Request-Body (Update der Adressdaten)
188
5.2.5 Ausliefern von statischen Inhalten
196
5.2.6 Dateiupload
199
5.3 Node.js als HTTP-Client
203
5.3.1 Requests mit dem »http«-Modul
203
5.3.2 Die fetch-API
204
5.3.3 Das »ky«-Paket
206
5.3.4 HTML-Parser
209
5.4 Sichere Kommunikation mit HTTPS
211
5.4.1 Zertifikate erstellen
211
5.4.2 HTTPS im Webserver verwenden
212
5.5 HTTP/2
213
5.5.1 Der HTTP/2-Server
214
5.5.2 HTTP/2 in der Adressbuch-Applikation
215
5.5.3 Der Stream-Modus des »http2«-Moduls
216
5.5.4 Server Push
220
5.5.5 Der HTTP/2-Client
222
5.6 Zusammenfassung
224
6 Express
227
6.1 Aufbau
227
6.2 Installation
229
6.3 Grundlagen
230
6.3.1 Request
230
6.3.2 Response
233
6.4 Architektur einer Express-Applikation
234
6.4.1 Struktur einer Applikation
235
6.5 Filmdatenbank
237
6.5.1 Routing
238
6.5.2 Controller
241
6.5.3 Model
243
6.5.4 View
245
6.6 Middleware
247
6.6.1 Eigene Middleware
248
6.6.2 Morgan – Logging-Middleware für Express
249
6.6.3 Statische Inhalte ausliefern
252
6.7 Dynamische Routen – Löschen von Datensätzen
254
6.8 Anlegen und Bearbeiten von Datensätzen – Zugriff auf den Request-Body
257
6.8.1 Umgang mit Formulareingaben – die Body-Parser-Middleware
261
6.9 Validierung von Eingaben mit Zod
265
6.10 Express 5
269
6.10.1 Änderungen in Express 5
270
6.10.2 LTS Timeline
270
6.11 HTTPS und HTTP/2
271
6.11.1 HTTPS
271
6.11.2 HTTP/2
272
6.12 Zusammenfassung
273
7 Template-Engines
277
7.1 Template-Engines in der Praxis – Pug
278
7.1.1 Installation
278
7.1.2 Pug und Express.js – Integration
278
7.1.3 Variablen in Pug
282
7.1.4 Die Besonderheiten von Pug
284
7.1.5 Bedingungen und Schleifen
285
7.1.6 Extends und Includes
287
7.1.7 Mixins
290
7.1.8 Pug unabhängig von Express verwenden
292
7.1.9 Compiling
293
7.2 Handlebars
294
7.2.1 Installation
294
7.2.2 Integration in Express.js
294
7.2.3 Bedingungen und Schleifen
297
7.3 Zusammenfassung und Ausblick
299
8 Anbindung von Datenbanken
301
8.1 Node.js und relationale Datenbanken
302
8.1.1 MySQL
303
8.1.2 SQLite
315
8.1.3 ORM
320
8.2 Node.js und nicht relationale Datenbanken
326
8.2.1 Redis
327
8.2.2 MongoDB
333
8.3 Zusammenfassung
342
9 Authentifizierung und Sessionhandling
345
9.1 Passport
345
9.2 Setup und Konfiguration
346
9.2.1 Installation
346
9.2.2 Konfiguration
346
9.2.3 Konfiguration der Strategy
349
9.3 Anmeldung an der Applikation
350
9.3.1 Anmeldeformular
350
9.3.2 Absicherung von Ressourcen
353
9.3.3 Abmelden
354
9.3.4 Anbindung an die Datenbank
356
9.4 Zugriff auf Ressourcen
360
9.4.1 Zugriffsbeschränkung
360
9.4.2 Bewertungen abgeben
366
9.5 Externer Identity Provider
372
9.5.1 Identity-Provider-Setup
373
9.5.2 Konfiguration der Applikation
373
9.6 Zusammenfassung
378
10 REST-Server
381
10.1 REST – eine kurze Einführung und wie es in Webapplikationen verwendet wird
381
10.2 Zugriff auf die Applikation
382
10.2.1 Postman
382
10.2.2 cURL
383
10.3 Anpassungen an der Applikationsstruktur
384
10.4 Lesende Anfragen
385
10.4.1 Alle Datensätze einer Ressource auslesen
385
10.4.2 Zugriff auf einen Datensatz
388
10.4.3 Fehlerbehandlung
390
10.4.4 Sortieren der Liste
391
10.4.5 Steuern des Ausgabeformats
394
10.5 Schreibende Anfragen
396
10.5.1 POST – Erstellen von neuen Datensätzen
397
10.5.2 PUT – bestehende Datensätze modifizieren
401
10.5.3 DELETE – Datensätze löschen
405
10.6 Authentifizierung mit JSON Web Tokens
407
10.6.1 Anmeldung
408
10.6.2 Absichern von Ressourcen
412
10.6.3 Zugriff auf Benutzerinformationen im Token
413
10.7 Einbindung eines externen Identity Providers
415
10.7.1 Konfiguration des Identity Providers
416
10.7.2 Integration in die Applikation
416
10.8 OpenAPI-Spezifikation – Dokumentation mit Swagger
419
10.9 Validierung
424
10.9.1 Installation und erste Überprüfung
424
10.9.2 Den Request-Body überprüfen
427
10.10 Zusammenfassung
430
11 GraphQL
433
11.1 GraphQL-Bibliotheken
434
11.2 Integration in Express
435
11.2.1 GraphiQL
438
11.3 Daten über die Schnittstelle auslesen
440
11.3.1 Abfragen parametrisieren
443
11.4 Schreibende Zugriffe auf die GraphQL-Schnittstelle
446
11.4.1 Neue Datensätze erstellen
446
11.4.2 Aktualisieren und Löschen von Datensätzen
449
11.5 Mit Subscriptions Updates in Echtzeit erhalten
453
11.6 Authentifizierung für die GraphQL-Schnittstelle
457
11.7 Zusammenfassung
462
12 Echtzeit-Webapplikationen
465
12.1 Die Beispielapplikation
466
12.2 Setup
466
12.3 WebSockets
473
12.3.1 Die Serverseite
474
12.3.2 Die Clientseite
476
12.3.3 User-Liste
479
12.3.4 Logout
483
12.4 Node.js als WebSocket-Client
487
12.5 Socket.IO
488
12.5.1 Installation und Einbindung
489
12.5.2 Socket.IO-API
490
12.6 Zusammenfassung
494
13 Typsichere Applikationen in Node.js
497
13.1 Typsysteme für Node.js
498
13.1.1 TypeScript
499
13.2 Werkzeuge und Konfiguration
501
13.2.1 Konfiguration des TypeScript-Compilers
501
13.2.2 Integration in Node.js
503
13.2.3 Integration in die Entwicklungsumgebung
504
13.2.4 »ts-node«
505
13.3 TypeScript-Grundlagen
506
13.3.1 Datentypen
507
13.3.2 Funktionen
509
13.3.3 Module
511
13.4 Klassen
512
13.4.1 Methoden
513
13.4.2 Zugriffsmodifikatoren
514
13.4.3 Vererbung
515
13.5 Interfaces
515
13.6 Type Aliases in TypeScript
517
13.7 Generics
519
13.8 TypeScript im Einsatz in einer Node.js-Applikation
520
13.8.1 Typdefinitionen
520
13.8.2 Typdefinitionen für JavaScript-Code erzeugen
521
13.8.3 Beispiel einer Express-Applikation
521
13.9 Native TypeScript-Unterstützung in Node.js
523
13.9.1 Vollständiger TypeScript-Support in Node.js
523
13.9.2 Type Stripping in Node.js
524
13.10 Zusammenfassung
525
14 Webapplikationen mit Nest
527
14.1 Installation und erste Schritte mit Nest
528
14.2 Die Nest CLI
530
14.2.1 Kommandos für den Betrieb und das Ausführen der Applikation
531
14.2.2 Erstellen von Strukturen in der Applikation
532
14.3 Struktur der Applikation
534
14.3.1 Das Wurzelverzeichnis mit den Konfigurationsdateien
534
14.3.2 Das src-Verzeichnis – das Herzstück der Applikation
535
14.3.3 Weitere Verzeichnisse der Applikation
536
14.4 Module – logische Einheiten im Quellcode
536
14.4.1 Module erzeugen
537
14.4.2 Der Module-Decorator
538
14.5 Controller – die Endpunkte einer Applikation
539
14.5.1 Einen Controller erzeugen
539
14.5.2 Implementierung eines Controllers
540
14.5.3 Einbindung und Überprüfung des Controllers
542
14.6 Providers – die Businesslogik der Applikation
543
14.6.1 Einen Service erzeugen und einbinden
543
14.6.2 Die Implementierung des Service
544
14.6.3 Einbindung des Service über die Dependency Injection von Nest
546
14.7 Validierung
548
14.8 Zugriff auf Datenbanken
551
14.8.1 Setup und Installation
551
14.8.2 Zugriff auf die Datenbank
554
14.9 Dokumentation der Endpunkte mit OpenAPI
559
14.10 Authentifizierung
563
14.10.1 Setup
564
14.10.2 Authentifizierungsservice
565
14.10.3 Der Login-Controller – der Endpunkt für die Benutzeranmeldung
566
14.10.4 Routen absichern
568
14.11 Ausblick: Testen in Nest
571
14.12 Zusammenfassung
574
15 Node für Kommandozeilenwerkzeuge
577
15.1 Grundlagen
577
15.1.1 Aufbau
578
15.1.2 Ausführbarkeit
579
15.2 Der Aufbau einer Kommandozeilenapplikation
580
15.2.1 Datei und Verzeichnisstruktur
580
15.2.2 Paketdefinition
581
15.2.3 Die Mathe-Trainer-Applikation
582
15.3 Zugriff auf Ein- und Ausgabe
585
15.3.1 Ausgabe
586
15.3.2 Eingabe
587
15.3.3 Benutzerinteraktion mit dem »readline«-Modul
588
15.3.4 Optionen und Argumente
591
15.4 Werkzeuge
594
15.4.1 Commander
595
15.4.2 Chalk
597
15.4.3 node-emoji
599
15.4.4 Blessed
602
15.5 Signale
605
15.6 Exit Codes
608
15.7 Zusammenfassung
609
16 Asynchrone Programmierung
611
16.1 Externe Kommandos mit dem »child-process«-Modul asynchron ausführen
611
16.1.1 Die »exec«-Methode
613
16.1.2 Die »spawn«-Methode
617
16.2 Node.js-Kindprozesse erzeugen mit »fork«
620
16.3 Das »cluster«-Modul
626
16.3.1 Der Hauptprozess
626
16.3.2 Die Workerprozesse
631
16.4 Worker-Threads
635
16.4.1 Geteilter Speicher im »worker_threads«-Modul
637
16.5 Zusammenfassung
640
17 Streams
643
17.1 Einleitung
643
17.1.1 Was ist ein Stream?
643
17.1.2 Wozu verwendet man Streams?
644
17.1.3 Welche Streams gibt es?
645
17.1.4 Streamversionen in Node.js
645
17.1.5 Streams sind EventEmitter
646
17.2 Readable Streams
647
17.2.1 Einen Readable Stream erstellen
647
17.2.2 Die Readable-Stream-Schnittstelle
648
17.2.3 Die Events eines Readable Streams
649
17.2.4 Fehlerbehandlung in Readable Streams
651
17.2.5 Methoden
652
17.2.6 Piping
653
17.2.7 Readable-Stream-Modi
653
17.2.8 Wechsel in den Flowing Mode
654
17.2.9 Wechsel in den Paused Mode
654
17.2.10 Eigene Readable Streams
655
17.2.11 Beispiel für einen Readable Stream
656
17.2.12 Readable-Shortcut
659
17.3 Writable Streams
660
17.3.1 Einen Writable Stream erstellen
660
17.3.2 Events
661
17.3.3 Fehlerbehandlung in Writable Streams
662
17.3.4 Methoden
663
17.3.5 Schreiboperationen puffern
664
17.3.6 Flusssteuerung
665
17.3.7 Eigene Writable Streams
666
17.3.8 Writable-Shortcut
667
17.4 Duplex-Streams
668
17.4.1 Duplex-Streams im Einsatz
668
17.4.2 Eigene Duplex-Streams
670
17.4.3 Duplex-Shortcut
671
17.5 Transform-Streams
672
17.5.1 Eigene Transform-Streams
672
17.5.2 Transform-Shortcut
673
17.6 Web Streams API
674
17.6.1 Readable Streams mit der Web Streams API
674
17.6.2 Writable Streams in der Web Streams API
678
17.6.3 Transform-Streams in der Web Streams API
679
17.6.4 Umwandlung von Node in Web Streams
681
17.6.5 Spezielle Web-Stream-Klassen
682
17.7 Zusammenfassung
683
18 Arbeiten mit Dateien
685
18.1 Synchrone und asynchrone Funktionen
685
18.2 Existenz von Dateien
687
18.3 Dateien lesen
688
18.4 Fehlerbehandlung
693
18.5 In Dateien schreiben
695
18.6 Verzeichnisoperationen
699
18.7 Weiterführende Operationen
702
18.7.1 »watch«
705
18.7.2 Zugriffsberechtigungen
708
18.8 Zusammenfassung
710
19 Paketmanager
713
19.1 Die häufigsten Operationen
714
19.1.1 Pakete suchen
714
19.1.2 Die richtigen Pakete finden
716
19.1.3 Pakete installieren
720
19.1.4 Installierte Pakete anzeigen
727
19.1.5 Pakete verwenden
728
19.1.6 Pakete aktualisieren
729
19.1.7 Pakete entfernen
731
19.1.8 Sicherheitsüberprüfungen
732
19.1.9 Die wichtigsten Kommandos im Überblick
733
19.2 Weiterführende Operationen
733
19.2.1 Der Aufbau eines Moduls
734
19.2.2 Eigene Pakete erstellen
737
19.2.3 NPM-Skripte
742
19.3 Werkzeuge für NPM
744
19.3.1 SBOM erzeugen
744
19.3.2 Registry Proxy
746
19.3.3 Unterstützung bei Aktualisierungen
747
19.3.4 »npx«
747
19.4 Corepack
748
19.5 Yarn
749
19.6 pnpm
750
19.7 Zusammenfassung
751
20 Qualitätssicherung
753
20.1 Styleguides
754
20.1.1 Der Airbnb-Styleguide
755
20.2 Linter
756
20.2.1 ESLint
756
20.3 Prettier
762
20.3.1 Installation
763
20.3.2 Ausführung
763
20.4 PMD CPD
763
20.4.1 Installation
765
20.4.2 Ausführung
765
20.5 Husky
766
20.6 Zusammenfassung
767
21 Testing
769
21.1 Unittesting
769
21.1.1 Anforderungen an Unittests
769
21.1.2 Verzeichnisstruktur
770
21.1.3 Unittests und Node.js
771
21.1.4 Triple-A
771
21.2 Assertion Testing
772
21.2.1 Exceptions
775
21.2.2 Promises testen
776
21.3 Der Node Test Runner
778
21.4 Vitest
781
21.4.1 Konfiguration
782
21.4.2 Tests mit Vitest ausführen
783
21.4.3 Assertions
786
21.4.4 Eigene Assertions in Vitest
787
21.4.5 Code Coverage
788
21.4.6 Spys
791
21.5 Praktisches Beispiel von Unittests mit »Vitest«
792
21.5.1 Der Test
793
21.5.2 Die Implementierung
795
21.5.3 Triangulation – der zweite Test
796
21.5.4 Verbesserung der Implementierung
798
21.6 Umgang mit Abhängigkeiten – Mocking
799
21.6.1 Module mocken
799
21.7 Zusammenfassung
802
22 Sicherheitsaspekte
803
22.1 »filter input« und »escape output«
804
22.1.1 »filter input«
804
22.1.2 Black- und Whitelisting
804
22.1.3 »escape output«
805
22.2 Absicherung des Servers
807
22.2.1 Benutzerberechtigungen
807
22.2.2 Probleme durch den Single-threaded-Ansatz
808
22.2.3 Denial of Service
813
22.2.4 Reguläre Ausdrücke
814
22.2.5 HTTP-Header
815
22.2.6 Fehlermeldungen
818
22.2.7 SQL-Injections
819
22.2.8 »eval«
823
22.2.9 Method Invocation
825
22.2.10 Überschreiben von Built-ins
828
22.3 NPM-Sicherheit
829
22.3.1 Berechtigungen
829
22.3.2 Node Security Platform
830
22.3.3 NPM-Skripte
831
22.3.4 Bekannte Sicherheitsvorfälle und die Lehren daraus
832
22.4 Schutz des Clients
833
22.4.1 Cross-Site-Scripting
833
22.4.2 Cross-Site-Request-Forgery
835
22.5 Das Node.js Permission System
838
22.6 Zusammenfassung
840
23 Skalierbarkeit und Deployment
843
23.1 Vorbereitung für die Produktion
843
23.1.1 Die Beispielapplikation
844
23.1.2 Konfiguration
846
23.1.3 Logging
847
23.1.4 Linting
847
23.1.5 Tests
848
23.2 Deployment-Grundlagen und -Strategien
849
23.2.1 Grundlegendes Setup
849
23.2.2 Wie man es nicht macht: manuelles Deployment
850
23.2.3 Plattformen im Überblick
851
23.2.4 Containerisierung
853
23.2.5 Build-Pipelines
858
23.3 Die Anwendung am Laufen halten und überwachen
860
23.3.1 »pm2« – Prozessmanagement
860
23.3.2 Health Checks
861
23.3.3 Graceful Shutdown
863
23.4 Skalierung
864
23.4.1 Kindprozesse
865
23.4.2 Loadbalancer
869
23.5 Zusammenfassung
872
24 Performance
873
24.1 YAGNI – You Ain’t Gonna Need It
873
24.2 CPU
874
24.2.1 CPU-blockierende Operationen
874
24.2.2 Die CPU-Last messen
875
24.2.3 CPU-Profiling mit den Chrome DevTools
876
24.3 Zeitmessung in Node.js
877
24.3.1 Einfache Zeitmessungen mit »console.time«
877
24.3.2 Tiefe Einblicke mit der Performance-Hooks-Schnittstelle
878
24.3.3 Weitere Events mit der Performance-Hooks-Schnittstelle messen
881
24.4 Arbeitsspeicher
882
24.4.1 Memory Leaks
883
24.4.2 Speicheranalyse in den DevTools
884
24.4.3 Speicherstatistik von Node.js
887
24.5 Netzwerk
889
24.6 Zusammenfassung
893
25 JavaScript Runtimes
895
25.1 Deno
895
25.1.1 Die zehn Dinge, die Ryan Dahl bereut
896
25.1.2 Die Architektur von Deno
898
25.1.3 Installation von Deno
899
25.1.4 Die Deno-CLI
900
25.1.5 Ausführen einer Deno-Applikation
902
25.1.6 Ausführung einer TypeScript-Applikation
903
25.1.7 Module und Paketverwaltung
904
25.1.8 Standardbibliothek und APIs
906
25.1.9 Sicherheit
908
25.1.10 Node.js-Kompatibilität
910
25.1.11 NPM-Kompatibilität
911
25.1.12 Verwenden von CommonJS-Modulen
912
25.1.13 Eine Webapplikation in Deno
913
25.2 Bun
916
25.2.1 Die wichtigsten Features von Bun
916
25.2.2 Architektur
917
25.2.3 Installation
917
25.2.4 Die Bun-Kommandozeile
918
25.2.5 Ausführen einer Applikation
920
25.2.6 Die Bun-APIs
920
25.2.7 Node.js-Kompatibilität
921
25.2.8 Paketmanagement in Bun
922
25.2.9 Web-App in Bun
923
25.3 Zusammenfassung
925
26 Künstliche Intelligenz mit Node.js nutzen
927
26.1 Überblick über Generative AI
927
26.1.1 Qualität eines LLMs
928
26.1.2 Textgenerierung in einem LLM
929
26.1.3 Welche Modelle gibt es?
930
26.2 LLMs nutzen
931
26.2.1 Ollama – die Plattform für die lokale LLM-Ausführung
931
26.2.2 Kommunikation mit dem LLM über HTTP
933
26.2.3 Anbindung des LLMs mit dem »ollama«-Paket
937
26.2.4 Verwendung des »openai«-Pakets
938
26.3 Ein Chatbot auf der Kommandozeile
939
26.4 Multimodale LLMs
942
26.5 Modulare Applikationen mit LangChain
944
26.5.1 Eine einfache LangChain-Applikation
945
26.5.2 Chatbot mit Historie in LangChain
946
26.5.3 Tool Calling mit LangChain
948
26.6 Das Model Context Protocol
953
26.6.1 MCP-Kategorien
954
26.6.2 Implementierung des MCP-Servers
954
26.6.3 Client-Server-Kommunikation über stdio
957
26.6.4 Kommunikation über Streamable HTTP
960
26.6.5 Integration von MCP in eine LangChain-Applikation
962
26.7 Zusammenfassung
964
Index
965