In diesem Artikel werde ich über die Funktionen und Fähigkeiten von Midmare sprechen und meine Erfahrungen beim Erstellen Ihrer eigenen Bibliothek teilen.
Hintergrund
Das Produkt, mit dem ich arbeite, befindet sich derzeit in einem Migrationsprozess. Bis es vorbei ist, existieren wir parallel auf zwei Plattformen und entfernen uns vom Erbe. Ich mache ein Webanwendungs-Backend für eine neue Plattform. Einige Prozesse müssen ständig mit anderen Teams vereinheitlicht werden.
Unter Berücksichtigung dieser Funktionen musste eine flexible und universelle Lösung gefunden werden, um das vorhandene Backend neu zu schreiben. Diese Lösung war die Midmare-Bibliothek.
Einführungsaufgaben
Ich hatte die Aufgabe, es so zu gestalten, dass die Bibliothek sowohl mit TypeScript als auch mit JavaScript verwendet werden kann. Gleichzeitig war das Team bestrebt, den Code vollständig von TS auf JS umzuschreiben, um die Entwicklung zu beschleunigen.
JS ist nicht typisiert, daher ist die Entwicklung viel schneller, wenn auch weniger stabil. Wir waren bereit, solche Risiken einzugehen, wie wir uns durch genügend Tests schützen wollten.
Zuerst dachte ich anderthalb Wochen lang über das Konzept nach und ging verschiedene Optionen durch. Bis ich auf die Idee kam, dass es cool wäre, einen funktionalen Ansatz zu verwenden, damit jedes Glied ohne Konsequenzen in eine beliebige Ausführungskette eingefügt werden kann.
Ich hatte die Idee, Middleware zu verwenden
Das heißt, eine Kette von Zwischenverarbeitungsfunktionen zu erstellen, die nacheinander ausgeführt werden und auf die Fehler des anderen (Fehler, Probleme, Datenänderungen usw.) reagieren.
Also habe ich einen Stapel Middleware bekommen, der im Prinzip Koa ähnelt. Diese Ähnlichkeit stellt sicher, dass der Rest der Bibliothek einfach zu verwenden ist. In Midmare gibt es jedoch viel weniger Methoden, nur 4. Die Midmare-Bibliothek selbst ist minimalistisch.
Arbeitsbeginn
Vor der Installation von Midmare müssen Sie Node.js Version 10 oder höher herunterladen und installieren. Wenn Sie ein neues Projekt erstellen, müssen Sie zuerst package.json mit dem Befehl npm init erstellen .
Die Installation von Midmare erfolgt über den Befehl npm install midmare .
Unten finden Sie ein Beispiel für die Initialisierung der Anwendung.
Allgemeine Anwendungsinitialisierung auf Midmare Verwenden von Routern (Middleware auf Routerebene
)
Midmare-Funktionen
In erster Linie geht es um die beeindruckenden Funktionen zur Code-Zerlegung. Zwischenfunktionen (Middleware) wissen möglicherweise nichts voneinander. Sie nehmen einfach Daten, verarbeiten sie und geben sie weiter frei.
Die Midmare-Bibliothek ist ideal, wenn Sie dasselbe Routing-System für verschiedene APIs verwenden müssen - Quelle und Ziel. Das heißt, wenn Sie einen bestimmten gemeinsamen Verarbeitungsknoten erstellen müssen. Sie können aber auch einfachere Anwendungen erstellen.
Hier sind einige Beispiele, um die Fähigkeiten von Midmare hervorzuheben.
Fehler mit einer Zwischenfunktion abfangen. Dies ist auch ein Beispiel für die Codezerlegung.
Eine einfache Zwischenfunktion, die eine HTTP-Sitzung bei Nichtübereinstimmung der Route schließt.
Ein Beispiel für die Verarbeitung eines Befehls, in diesem Fall das Senden von Daten an Redis
Die kleine Bibliothek macht ihren kleinen Job, schränkt aber die verfügbaren Optionen in keiner Weise ein. In Midmare können Sie praktisch alles verbinden - ohne sich Gedanken darüber zu machen, wie eine Architektur erstellt wird.
Hauptvorteil
Der Hauptvorteil dieser Bibliothek ist die vollständige Isolierung von allen Schichten (HTTP, WS usw.). Wenn Koa für einen HTTP-Server ausgelegt ist, schafft Midmare diesbezüglich keine Einschränkungen.
Sie können sogar einfach ein Terminal-Dienstprogramm schreiben. Mit Midmare ist dies praktisch, da wir Parameter in verwenden können
path. Wie im folgenden Beispiel:
Mit Midmare können Sie zum selben HTTP-Server zurückkehren. Es wird nicht schwierig sein, es anzuschließen. Es gibt bereits einen vorgefertigten Router für HTTP .
Sie können WebSockets jedoch auch sicher verbinden. Sie müssen nur den WebSockets-Client selbst initialisieren. Und dann liegt es am einfachsten Routing.
Beispiel für die Kombination von HTTP und WebSockets mit Midmare
Diese Vielseitigkeit macht es unnötig, über verschiedene Wege nachzudenken, um dasselbe Problem in einem Programm zu lösen.
Tatsächlich ist es ziemlich schwierig, alle Implementierungsmöglichkeiten aufzuzählen, da jede Idee ohne Einschränkungen auf die Bibliothek anwendbar ist.
Ich habe keine fertigen Bibliotheken dieses Formats gesehen
Das heißt, ein komplettes Analogon: Ohne Low-Level-Bindungen, ob WebSockets, HTTP oder allgemeiner Netzwerkkommunikation oder Software, die im Betriebssystem selbst funktionieren.
Midmare kann alles gleichzeitig und buchstäblich in 5-6 Abstimmungszeilen erledigen.
Und die Idee dahinter ist ganz einfach: Erstellen Sie eine Kette zur Ausführung von Funktionen mit der next / send-Methode zum Aufrufen. Wenn nichts weiter aufgerufen werden muss, wird das Programm gestoppt. Plus Routing, minus HTTP - und wir haben Midmare.
Warum diese Bibliothek benutzen?
Sie können jederzeit Ihre eigene Lösung schreiben. In diesem Fall ist Ihre Zerlegung oder der Code selbst möglicherweise lahm (z. B. können Sie möglicherweise nicht zwischen den Schritten in der Kette einklemmen). Wenn es viele solcher Fehler gibt, kann ein von Hand geschriebenes Programm in ein oder zwei Jahren zu einem schlechten Ende kommen. Midmare vermeidet dies.
Außerdem gibt es in der Welt der Programmierer zu viele Filter. Jemand möchte in TypeScript schreiben, jemand in JS. Ich suchte nach einer Lösung, um beide Optionen zu erfassen.
Jetzt versuche ich, Midmare aktiv zu testen und zu verfeinern.
Ein großes Plus einer kleinen Bibliothek ist, dass ihr Schöpfer sie aktiv unterstützt.
Ich teste meine Bibliothek jeden Tag und finde dementsprechend schnell Fallstricke oder Mängel. Mit einer kleinen Bibliothek kann jedes Problem in kürzester Zeit behoben werden.
Zyklische Anrufe sind das erste der behobenen Probleme
Schauen
wir uns das folgende Beispiel an: Nehmen wir an, wir müssen dem Schritt .process ('/ message') einen Aufruf '/ send' hinzufügen, aber .process ('/ send') enthält bereits einen Aufruf '/ message'. Dann ruft Schritt 2 Schritt 1 auf. Gleichzeitig wird in Schritt 1 der Aufruf von Schritt 2 jedes Mal ausgelöst - und so weiter im Kreis.
Wenn Sie an der Erstellung einer Bibliothek arbeiten, müssen Sie solche Probleme erkennen, sie den Benutzern zeigen und erklären, womit sie behaftet sind.
In diesem Fall wird der Fehler "Maximale Aufrufstapelgröße überschritten" angezeigt, und der JS fällt als Reaktion auf mehrere rekursive Aufrufe derselben Funktion ab.
Die Lösung für dieses Problem in dieser Bibliothek lautet: Pfadverlauf in einem Kontext halten. Das heißt, jeder Aufruf von "ctx.send" oder "app.send" hat seine eigene Anrufliste.
Da Midmare diesen Punkt im Griff hat, gibt die Bibliothek einen Fehler aus, wenn sie in einer Schleife aufgerufen wird.
Es kann vorkommen, dass ein zirkulärer Anruf erforderlich ist. Beispielsweise behandeln zwei Zwischenfunktionen dieselben Daten unterschiedlich, da die Möglichkeit besteht, aus der Schleife auszubrechen. Das heißt, wenn eine der Funktionen ein if-else enthält, das im else funktioniert und den zyklischen Aufruf ignoriert.
Für den Fall, dass für die Implementierung ein Zyklus erforderlich ist, kann Midmare den Fehler so einstellen, dass er über "signoreCycleError: true" ignoriert wird.
Die Bibliothek wartet auf ihre Community
Grundsätzlich macht es keinen Sinn, einer so reinen Bibliothek etwas hinzuzufügen. Es wäre schön, die Möglichkeit hinzuzufügen, Plugins zu verbinden, aber mit Middleware kann dies ohne neue Funktionen gelöst werden.
Wenn in einem bestimmten Fall eine Verarbeitung fehlt, können Sie diese selbst zu den bedingten 4 Zeilen hinzufügen. Wie im Beispiel mit der Funktion zum Schließen der HTTP-Sitzung:
Alle zusätzlichen Verarbeitungen können in ein separates Repository verschoben werden. Oder um Router an Repositorys zu verteilen. Alles wird auf die gleiche Weise verbunden und verarbeitet.
Was die Bibliothek jetzt wirklich gerne tun würde, ist eine Community, die ihre eigenen Tools aus der Bibliothek erstellt. Deshalb lade ich die Community ein, zur Entwicklung der Bibliothek beizutragen. Mach mit und teste.
Autor:Ivan Petushinsky, Senior Node.js Entwickler