Sådan skrives kraftfulde skemaer i JavaScript

Introduktion af schm, et funktionelt og meget komponerbart bibliotek til oprettelse af skemaer i JavaScript og Node.js

Baggrundsfoto af Willi Heidelbach

Jeg har arbejdet med HTML, CSS og JavaScript siden 2002. Den første gang, jeg havde brug for en slags skema i JavaScript, var bare et par år siden.

Efter at have brugt mange forskellige biblioteker og endda forfatter et og andet, besluttede jeg at oprette schm. Det er resultatet af al min erfaring med skemaer i JavaScript.

Hvad er schm?

schm er en gruppe af npm-pakker, der hjælper udviklere med at håndtere skemaer i JavaScript og Node.js.

Det er meget inspireret af Mongoose Schemas. Faktisk er de så ens, at du kan bruge schm-parametre inden for Mongoose Schemas og vice versa. Det er dog ikke MongoDB-specifikt. Du kan bruge det til alt i JavaScript.

Hvilke problemer løser schm?

Analyse og validering af formværdier

På klienten kan du bruge skemaer til at definere modeller til HTML-formularer. Det gør det lettere at transformere og validere værdier. Hvis du bruger Node.js på serveren, kan du også bruge det samme skema. Resultatet er en konsistent opførsel mellem klient- og servervalideringer.

Analyse og validering af forespørgselsstreng

Overvej følgende forespørgselsstreng: /? Term = John & page = 2 & limit = 10. Ved at kombinere pakker som schm-koa, schm-express og / eller schm-mongo vil du være i stand til let at analysere og validere forespørgselsstrenge med søgeudtryk og pagination med let.

☊ Kommunikation mellem klient og server

Hvis du for eksempel har en app, der bruger ressourcer fra et REST-API, kan du bruge skemaer til at definere på klienten den objektstruktur, som din klient forventer at modtage fra serveren. Hvis der ændres noget på serveren (egenskaber er f.eks. Omdøbt), kan du bare opdatere dit skema, så hele din applikation fortsætter med at arbejde.

Oprettelse af et skema

Et simpelt skema er bare et kort over nøgler og typer:

Det er det samme som at bruge en type egenskab:

Et skema kan også være et kort mellem taster og standardværdier. Typer udledes automatisk:

Det svarer til at gøre følgende:

Hvis du vil lære mere om, hvordan du skriver skemaer, skal du tage et kig på Mongoose Schemas.

Analyseværdier

Når du har defineret skemaet, kan du bruge det til at analysere værdier. Denne proces konverterer værdier til de rigtige typer samt anvender andre parsere defineret i skemaet. Dette er de tilgængelige parsere: type, standard, sæt, get, trim, store og små bogstaver.

Outputet vil være sådan som dette:

{
  navn: "HAZ",
  fødselsdato: Tir 10. april 1990 00:00:00 GMT,
}

Validering af værdier

Ligesom i Mongoose Schemas kan du definere valideringsregler inden for dine skemaer. Dette er de tilgængelige validatorer: validere, krævet, matche, enum, max, min, maxlength, minlength.

Du kan også oprette brugerdefinerede parsere og validatorer ved at udvide skemaet. Vi vil tale om det senere i denne artikel.

Valideringsfejlen er som standard en række objekter, der beskriver fejlene.

[
  {
    besked: "alder skal være større end eller lig 18",
    min: 18,
    param: "alder",
    validator: "min",
    værdi: 17,
  }
]

Hvis valideringen passerer, returnerer den de parsede værdier, ligesom parse ().

Komponering af flere skemaer

Lad os sige, at du har separate skemaer, der beskriver en krop, identitet og andre ting, og vil komponere dem til at opbygge et menneskeligt skema. Det er så let som det lyder:

En anden måde at komponere skemaer på er gennem reden. Et skema kan bruges som en type inden for et andet skema:

Udvidelse af skemaer

Dette er den del, hvor schm virkelig skinner. Du kan tilføje brugerdefinerede parsere og validatorer eller endda erstatte standardopførselen ved at analysere og validere metoder ved at oprette skemagrupper.

En skemagruppe er en funktion, der modtager det forrige skema som det eneste argument. Udover tidligere params, parsers og validatorer har skemaobjektet en fletningsmetode, som er nyttig for skemagruppefunktioner til at flette ny funktionalitet til de foregående skemaer.

Outputet fra ovenstående uddrag vil være sådan som dette:

{
  navn: "Haz !!!",
  alder: 27,
}

Hvis du vil gå længere og lære mere om, hvordan man opretter brugerdefinerede parsere, skal du tage et kig på, hvordan parsere er skrevet inde i kernebiblioteket her.

Ved at udvide skemaer kan vi oprette mange slags ting. Sådan skrives de fleste af schm-satellitbiblioteker, såsom schm-translate, schm-computed og schm-mongo.

Vi vil tale om en af ​​dem nu.

Omdøbning af værdietaster

schm-translate er et af de enkleste, men alligevel kraftige, satellitbiblioteker af schm. Det er et par mere end 10 linjer med kode, der er komprimeret til en funktion, der giver dig mulighed for at oversætte værdietaster til dine skemataster.

Lad os sige, at du arbejder på en webapp, der bruger ressourcer fra et REST-API. Pludselig ændrer udviklere ting på API, hvilket får svarorganet til at returnere en lidt anden model end den, som klienten forventede. I stedet for en e-mail-ejendom returnerer den nu en række e-mails.

Dette vil sandsynligvis få din app til at gå i stykker. Hvis du ikke har et skema eller nogen anden centraliseret måde at håndtere dette objekt på, skal du opdatere alle dele af applikationen for at overholde serverændringerne.

Med schm og schm-translate kan det løses ved at ændre et par kodelinjer på ét sted:

Outputet vil være nøjagtigt det, som din app forventede inden ændringen:

{
  navn: "Haz",
  e-mail: "[email protected]",
}

Klik her for at se listen over alle pakker

Hvordan adskiller dette sig fra andre skema-biblioteker?

Et almindeligt spørgsmål er forskellen mellem schm og andre biblioteker, såsom Joi og ajv (som følger JSON Schema spec).

Sammenlignet med ajv følger schm ikke nogen særlig specifikation. I stedet prøver den at efterligne Mongoose Schema API. Selvom ajv har nogle parsingfunktioner, er de begrænset til standardværdier og type tvang.

I schm er muligheden for at analysere værdier baseret på skemaet det, der gør det muligt at omdanne en forespørgselsstreng til en MongoDB-forespørgsel.

Når det er sagt, kan både Joi og ajv kombineres med schm. Du kan nemt udvide den til at bruge en anden valideringsmetode:

Tak, fordi du læste dette!

Hvis du kan lide det og finder det nyttigt, er her nogle ting, du kan gøre for at vise din støtte:

  • Tryk på klappen på denne artikel et par gange (op til 50)
  • Giv en stjerne ️ på GitHub: https://github.com/diegohaz/schm
  • Følg mig på GitHub: https://github.com/diegohaz
  • Følg mig på Twitter: https://twitter.com/diegohaz