für Node.js. Express unterstützt HTTP und HTTPS in Version 1 und 2. Express kümmert sich primär um das Routing in einer Applikation Außerdem verfügt es über eine Plugin-Schnittstelle, die Middleware genannt wird.
Eine Route besteht aus einer HTTP-Methode und einem Pfad. Die Flexibilität einer Route kann durch Variablen erhöht werden. Um den Router übersichtlich zu halten, werden die Callback- Funktionen für die einzelnen Routen ausgelagert.
zu extrahieren und die Informationen an das Model zu übergeben. Auf die Variablen im Pfad der Route wird über req.params.<var> zugegriffen Werden Informationen im Request-Body übermittelt, bindet man die body-parser-Middleware ein und greift dann auf req.body zu.
Redis, MongoDB. Für den Datenbankzugriff wird zunächst der Datenbanktreiber installiert. yarn add sqlite3 Zur einfacheren Handhabung der Operationen existieren verschiedene ORMs bzw. ODMs yarn add orm
einer Datenbank zu reduzieren, können ORMs beziehungsweise ODMs verwendet werden. Das ORM übernimmt eine Sicherheits-Funktion, indem es für das korrekte Escaping der Abfragen sorgt.
weitere Aufgaben wie die Validierung der Eingaben und verschiedene Berechnungen. Die meisten Operationen erfolgen asynchron. Das Model kann hier für eine saubere API sorgen, indem statt Callback- Funktionen asynchrone Funktionen verwendet werden.
und der Behandlung solcher Probleme, sollte das Auftreten solcher Situationen in einem Log festgehalten werden. Der Logger sollte die Informationen nicht lokal vorhalten, sondern die Möglichkeit bieten die Informationen an einen zentralen Logging Server zu senden.
beinhaltet bereits einige Appender für verschiedene Log-Targets wie zum Beispiel Dateien oder einen Logstash-Server. Der Logstash-Appender kann für das Remote-Logging verwerndet werden.
Ebenen: Unittests für einzelne Units of Code und Schnittstellen-Tests für das Big Picture. Für Unittests kommt Jasmine zum Einsatz und die Schnittstellen können zum Beispiel mit Frisby.js getestet werden.
lassen. Frisby ist eine Erweiterung des Jasmine- Testframeworks. frisby.js benötigt jasmine-node zur Ausführung der Tests. yarn add -D frisby jasmine-node
Node-Applikationen trotzdem schnell. Um mehrere Kerne nutzen zu können, kann das child_process Modul verwendet werden. Für die lokale Skalierung empfiehlt Express allerdings die Verwendung von PM2. yarn add pm2
Containern. Von jedem Service kann eine beliebige Anzahl von Containern gestartet werden. Wird der Funktionsumfang der Applikation erweitert, können zusätzliche Services hinzugefügt werden.
kann, wird ein zentraler Knoten benötigt, der sich um allgemeine Aufgaben wie beispielsweise Authentifizierung kümmert. Das API Gateway leitet die autorisierten Anfragen an die jeweiligen Services weiter und empfängt ihre Antworten, die dann zum Client weitergeleitet werden.
controller.getAll); Das erste Argument der add-Methode ist das Pattern, das den Service beschreibt. Das Pattern ist frei wählbar. Role und cmd haben sich aber als Best Practice etabliert. Das zweite Argument ist Aktion, also der Service-Handler. Hier kann wie schon bei Express beliebig abstrahiert werden.
await model.getAll(req); reply(null, JSON.stringify(articles)); } catch (e) { reply(e); } } Der Service-Handler erhält eine Repräsentation der Anfrage und eine Reply-Funktion. Über das msg-Objekt kann auf die Eigenschaften der Anfrage zugegriffen werden. Die Reply- Funktion wird mit einem Fehlerobjekt und den Nutzdaten aufgerufen.
if (err) { return console.error(err); } console.log(result); }); Mit der seneca.act-Methode kann ein Microservice konsumiert werden. Diese Methode akzeptiert eine Nachricht und eine Callback-Funktion. Mit der Nachricht wird der Service aufgelöst. Die Callback-Funktion wird aufgerufen, sobald der Service antwortet. Mit act können auch Routinen innerhalb eines Microservices aufgerufen werden (code reuse)
Der Name der Funktion wird zum Logging verwendet. Dem Plugin können Optionen übergeben werden, um es weiter zu konfigurieren. Das init-Pattern wird statt eines Konstruktors verwendet. const seneca = require('seneca')(); function articles(options) { this.add({role:'article',cmd:'get'}, controller.getAll); } seneca.use(articles);
this.wrap({role:'article'}, controller.verify); } seneca.use(articles); Mit der Wrap-Methode kann Funktionalität definiert werden, die für mehrere Patterns gilt. Mit this.prior(msg, respond) kann der ursprüngliche Service aufgerufen werden.
.use(articles) .listen(8080) Die listen-Methode bindet den Server an TCP-Port 8080. Der Service kann daraufhin per Browser oder mit einem anderen Server abgefragt werden: http://localhost:8080/act?role=article&cmd=get
Routen zur Applikation hinzu. Die Seneca Patterns müssen dazu etwas angepasst werden. Alle Routen die mit einem Aufruf von seneca.act('role:web', {routes: routes}) definiert werden, werden zu den Express- Routen hinzugefügt. Über das path-Pattern findet dann ein entsprechendes Matching statt.
über eine Message Queue kommuniziert werden. Der Vorteil hierbei ist, dass eine Queue Client und Server weiter entkoppelt und das gesamte System weniger Fehleranfällig macht.
für bestimmte Probleme, jedoch nicht für alle. Microservices erhöhen die Komplexität einer Applikation. In Node.js gibt es viele Pakete die sich mit diesem Thema beschäftigen. Etliche sind veraltet oder von schlechter Qualität. Ein genauer Blick auf GitHub und npmjs.com vor der Einbindung lohnt sich.