So schreiben Sie leistungsstarke Schemas in JavaScript

Wir stellen vor: schm, eine funktionale und äußerst komponierbare Bibliothek zum Erstellen von Schemas in JavaScript und Node.js

Hintergrundfoto von Willi Heidelbach

Ich arbeite seit 2002 mit HTML, CSS und JavaScript. Das erste Mal, dass ich ein Schema in JavaScript benötigte, war erst vor einigen Jahren.

Nachdem ich viele verschiedene Bibliotheken benutzt und sogar eine und eine andere geschrieben hatte, entschloss ich mich, schm zu erstellen. Dies ist das Ergebnis all meiner Erfahrungen mit Schemata in JavaScript.

Was ist schm

schm ist eine Gruppe von npm-Paketen, mit denen Entwickler mit Schemata in JavaScript und Node.js umgehen können.

Es ist stark von Mongoose Schemas inspiriert. Tatsächlich sind sie so ähnlich, dass Sie schm-Parameter in Mongoose-Schemas verwenden können und umgekehrt. Es ist jedoch nicht MongoDB-spezifisch. Sie können es für alles in JavaScript verwenden.

Welche Probleme löst schm?

Analysieren und Validieren von Formularwerten

Auf dem Client können Sie mithilfe von Schemas Modelle für HTML-Formulare definieren. Dies erleichtert die Transformation und Validierung von Werten. Wenn Sie Node.js auf dem Server verwenden, können Sie dasselbe Schema verwenden. Das Ergebnis ist ein konsistentes Verhalten zwischen Client- und Servervalidierungen.

Analyse und Validierung der Abfragezeichenfolge

Betrachten Sie die folgende Abfragezeichenfolge: /? Term = John & page = 2 & limit = 10. Durch das Kombinieren von Paketen wie schm-koa, schm-express und / oder schm-mongo können Sie Abfragezeichenfolgen mit Suchbegriffen und Paginierung mühelos analysieren und validieren.

☊ Kommunikation zwischen Client und Server

Wenn Sie beispielsweise eine App haben, die Ressourcen von einer REST-API verbraucht, können Sie mithilfe von Schemas auf dem Client die Objektstruktur definieren, die Ihr Client vom Server erwartet. Wenn sich auf dem Server etwas ändert (Eigenschaften wurden beispielsweise umbenannt), können Sie einfach Ihr Schema aktualisieren, damit Ihre gesamte Anwendung weiterhin funktioniert.

Schema erstellen

Ein einfaches Schema ist nur eine Karte mit Schlüsseln und Typen:

Das ist dasselbe wie bei der Verwendung einer type-Eigenschaft:

Ein Schema kann auch eine Zuordnung zwischen Schlüsseln und Standardwerten sein. Typen werden automatisch abgeleitet:

Dies entspricht den folgenden Schritten:

Weitere Informationen zum Schreiben von Schemata finden Sie unter Mongoose-Schemata.

Analysieren von Werten

Nachdem Sie das Schema definiert haben, können Sie es zum Analysieren von Werten verwenden. Dieser Prozess konvertiert Werte in die richtigen Typen und wendet andere im Schema definierte Parser an. Dies sind die verfügbaren Parser: Typ, Standard, Festlegen, Abrufen, Zuschneiden, Großbuchstaben, Kleinbuchstaben.

Die Ausgabe wird ungefähr so ​​aussehen:

{
  Name: "HAZ",
  Geburtstag: Di Apr 10 1990 00:00:00 GMT,
}

Werte validieren

Genau wie in Mongoose-Schemata können Sie Validierungsregeln in Ihren Schemata definieren. Dies sind die verfügbaren Validatoren: validieren, erforderlich, übereinstimmen, enum, max, min, maxlength, minlength.

Sie können auch benutzerdefinierte Parser und Validatoren erstellen, indem Sie das Schema erweitern. Wir werden später in diesem Artikel darüber sprechen.

Der Validierungsfehler ist standardmäßig ein Array von Objekten, die die Fehler beschreiben.

[
  {
    Meldung: "Alter muss größer oder gleich 18 sein",
    min: 18,
    Parameter: "Alter",
    Validator: "min",
    Wert: 17,
  }
]

Wenn die Validierung erfolgreich ist, werden die analysierten Werte genau wie bei parse () zurückgegeben.

Mehrere Schemas erstellen

Angenommen, Sie haben separate Schemata, die einen Körper, eine Identität und andere Dinge beschreiben, und möchten sie zusammenstellen, um ein menschliches Schema zu erstellen. Das ist so einfach wie es sich anhört:

Eine andere Möglichkeit zum Erstellen von Schemas ist das Verschachteln. Ein Schema kann als Typ in einem anderen Schema verwendet werden:

Schemas erweitern

Dies ist der Teil, an dem schm wirklich glänzt. Sie können benutzerdefinierte Parser und Validatoren hinzufügen oder sogar das Standardverhalten von Analyse- und Validierungsmethoden ersetzen, indem Sie Schemagruppen erstellen.

Eine Schemagruppe ist eine Funktion, die das vorherige Schema als einziges Argument empfängt. Neben früheren Parametern, Parsern und Validatoren verfügt das Schemaobjekt über eine Mergemethode, mit der Schemagruppenfunktionen neue Funktionen in die vorherigen Schemas einbinden können.

Die Ausgabe des obigen Snippets sieht ungefähr so ​​aus:

{
  name: "Haz !!!",
  Alter: 27,
}

Wenn Sie mehr darüber erfahren möchten, wie Sie benutzerdefinierte Parser erstellen, lesen Sie hier, wie Parser in der Kernbibliothek geschrieben sind.

Indem wir Schemata erweitern, können wir viele Arten von Dingen erstellen. So werden die meisten der schm-Satellitenbibliotheken wie schm-translate, schm-computed und schm-mongo geschrieben.

Wir werden jetzt über einen von ihnen sprechen.

Umbenennen von Werteschlüsseln

schm-translate ist eine der einfachsten und leistungsfähigsten Satellitenbibliotheken von schm. Es sind ein paar mehr als 10 Codezeilen, die in einer Funktion komprimiert sind, mit der Sie Werteschlüssel in Ihre Schemaschlüssel übersetzen können.

Angenommen, Sie arbeiten an einer Webanwendung, die Ressourcen von einer REST-API verbraucht. Plötzlich ändern Entwickler Dinge an der API, was dazu führt, dass der Antworttext ein etwas anderes Modell zurückgibt als vom Client erwartet. Anstelle einer E-Mail-Eigenschaft wird jetzt eine Reihe von E-Mails zurückgegeben.

Dies wird wahrscheinlich dazu führen, dass Ihre App abstürzt. Wenn Sie kein Schema oder keine andere zentralisierte Methode zur Behandlung dieses Objekts haben, müssen Sie jeden Teil der Anwendung aktualisieren, um den Serveränderungen zu entsprechen.

Mit schm und schm-translate kann dies durch Ändern einiger Codezeilen an nur einer Stelle gelöst werden:

Die Ausgabe entspricht genau der, die Ihre App vor der Änderung erwartet hat:

{
  Name: "Haz",
  E-Mail: "hazdiego@gmail.com",
}

Klicken Sie hier, um die Liste aller Pakete anzuzeigen

Wie unterscheidet sich dies von anderen Schemabibliotheken?

Eine häufige Frage ist der Unterschied zwischen schm und anderen Bibliotheken, wie z. B. Joi und ajv (die der JSON-Schema-Spezifikation folgen).

Schm folgt im vergleich zu ajv keiner bestimmten spezifikation. Stattdessen wird versucht, die Mongoose-Schema-API nachzuahmen. Auch wenn ajv über einige Analysefunktionen verfügt, sind sie auf Standardwerte und Typenzwang beschränkt.

In schm ermöglicht die Fähigkeit, Werte basierend auf dem Schema zu analysieren, beispielsweise die Umwandlung einer Abfragezeichenfolge in eine MongoDB-Abfrage.

Das heißt, sowohl Joi als auch ajv können mit schm kombiniert werden. Sie können es problemlos erweitern, um eine andere Validierungsmethode zu verwenden:

Vielen Dank für das Lesen!

Wenn es Ihnen gefällt und Sie es nützlich finden, können Sie Folgendes tun, um Ihre Unterstützung zu demonstrieren:

  • Drücke mehrmals auf den Klatsch-Knopf in diesem Artikel (bis zu 50).
  • Gib einen Stern Git auf GitHub: https://github.com/diegohaz/schm
  • Folgen Sie mir auf GitHub: https://github.com/diegohaz
  • Folgen Sie mir auf Twitter: https://twitter.com/diegohaz