Sådan skriver du kraftfulde skemaer i JavaScript

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

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

Efter at have brugt mange forskellige biblioteker og endda skrevet en og en anden 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 stærkt inspireret af Mongoose Schemas. Faktisk er de så ens, at du kan bruge schmparametre i Mongoose Schemas og omvendt. Det er dog ikke MongoDB-specifikt. Du kan bruge det til alt i JavaScript.

Hvilken slags 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. Også, hvis du bruger Node.js på serveren, kan du bruge det samme skema. Resultatet er en konsekvent adfærd mellem klient- og servervalideringer.

? Analyse og validering af forespørgselsstreng

Overvej følgende søgestrengen: /?term=John&page=2&limit=10. Ved at kombinere pakker som schm-koa, schm-express og / eller schm-mongo, kan du let analysere og validere forespørgselsstrenge med søgeudtryk og paginering.

☊ Kommunikation mellem klient og server

Hvis du f.eks. Har en app, der bruger ressourcer fra en REST API, kan du bruge skemaer til på klienten at definere 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 typeejendom:

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

Det svarer til at gøre følgende:

Hvis du vil vide mere om, hvordan du skriver skemaer, skal du kigge på Mongoose Schemas.

Parsing af værdier

Når du har defineret skemaet, kan du bruge det til at analysere værdier. Denne proces konverterer værdier til de korrekte typer såvel som anvendelse af andre parsere defineret i skemaet. Disse er de tilgængelige parsere: type, default, set, get, trim, uppercase, lowercase.

Outputtet vil være sådan noget:

{ name: "HAZ", birthdate: Tue Apr 10 1990 00:00:00 GMT,}

Validerende værdier

Ligesom i Mongoose Schemas kan du definere valideringsregler inden for dine skemaer. Disse er de tilgængelige validatorer: validate, required, match, enum, max, min, maxlength, minlength.

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

Valideringsfejlen vil som standard være en række objekter, der beskriver fejlene.

[ { message: "age must be greater than or equal 18", min: 18, param: "age", validator: "min", value: 17, }]

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

Komponere flere skemaer

Sig du har separate skemaer beskriver en body, identityog andre ting, og ønsker at komponere dem til at bygge et humanskema. Det er så let som det lyder:

En anden måde at komponere skemaer på er gennem indlejring. Et skema kan bruges som et typeinden for et andet skema:

Udvidelse af skemaer

Dette er den del, hvor schmvirkelig skinner. Du kan tilføje brugerdefinerede parsere og validatorer eller endda erstatte standardadfærd for parseog validatemetoder ved at oprette skemagrupper.

En skemagruppe er en funktion, der modtager det tidligere skema som det eneste argument. Udover tidligere params, parsersog validators, skemaet objekt har en mergefremgangsmåde, som er nyttig til skema koncernfunktioner at fusionere ny funktionalitet i de tidligere skemaer.

Outputtet fra ovenstående uddrag vil være sådan:

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

Hvis du vil gå videre og lære mere om, hvordan du opretter brugerdefinerede parsere, skal du se på, hvordan parsers er skrevet inde i kernebiblioteket her.

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

Vi skal tale om en af ​​dem nu.

Omdøbning af værditaster

schm-translate er et af de enkleste, men alligevel stærke, satellitbiblioteker fra schm. Det er et par mere end 10 linjer kode komprimeret til en funktion, som lader dig oversætte værditaster til dine skemataster.

Sig, at du arbejder på en webapp, der bruger ressourcer fra en REST API. Pludselig ændrer udviklere ting på API'en, hvilket får svarorganet til at returnere en lidt anden model end den, klienten forventede. I stedet for en emailejendom returnerer den nu en matrix af emails.

Dette får din app sandsynligvis til at gå i stykker. Hvis du ikke har et skema eller nogen anden central måde at håndtere det objekt på, skal du opdatere alle dele af applikationen, så de overholder serverændringerne.

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

Outputtet vil være nøjagtigt det, din app forventede før ændringen:

{ name: "Haz", email: "[email protected]",}

Klik her for at se listen over alle pakker

Hvordan adskiller dette sig fra andre skemabiblioteker?

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

Sammenholdt med ajv, schmfølger ikke nogen bestemt spec. I stedet forsøger den at efterligne Mongoose Schema API. Selvom der ajver nogle parsefunktioner, er de også begrænset til standardværdier og type tvang.

I schm, evnen til at analysere værdier baseret på skemaet er det, der gør det muligt at omdanne en forespørgsel snor i en MongoDB forespørgsel, f.eks.

Når det er sagt, både Joiog ajvkan kombineres med schm. Du kan nemt udvide det 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:

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