Kako napisati moćne sheme u JavaScript

Predstavljamo schm, funkcionalnu i visoko komponibilnu biblioteku za stvaranje shema u JavaScript-u i Node.js-u

S HTML-om, CSS-om i JavaScriptom radim od 2002. Prvi put mi je trebala neka vrsta sheme u JavaScript-u prije samo nekoliko godina.

Nakon što sam koristio mnogo različitih knjižnica, pa čak i autor jedne i druge, odlučio sam stvoriti schm. To je rezultat sveg mog iskustva sa shemama u JavaScript-u.

Što je schm?

schm je grupa npm paketa koji pomažu programerima da se bave shemama u JavaScriptu i Node.js.

Iznimno je nadahnut Mongoose Shemama. Zapravo, toliko su slični da možete koristiti schmparametre unutar Mongoose Shema i obrnuto. Ipak, to nije specifično za MongoDB. Možete ga koristiti za sve u JavaScript-u.

Kakve probleme rješava schm?

? Raščlanjivanje i provjera vrijednosti oblika

Na klijentu možete koristiti sheme za definiranje modela za HTML obrasce. Olakšava transformiranje i provjeru vrijednosti. Također, ako na poslužitelju koristite Node.js, možete koristiti istu shemu. Rezultat je dosljedno ponašanje između provjere valjanosti klijenta i poslužitelja.

? Raščlanjivanje i provjera niza upita

Razmislite o sljedećem upitu: /?term=John&page=2&limit=10. Kombinacijom paketa kao što su schm-koa, schm-express i / ili schm-mongo, moći ćete s lakoćom raščlaniti i provjeriti nizove upita s pojmovima za pretraživanje i paginacijom.

☊ Komunikacija između klijenta i poslužitelja

Ako, na primjer, imate aplikaciju koja troši resurse iz REST API-ja, pomoću shema možete na klijentu definirati strukturu objekta koju vaš klijent očekuje od poslužitelja. Ako se nešto promijeni na poslužitelju (svojstva su, na primjer, preimenovana), možete jednostavno ažurirati svoju shemu tako da će cijela vaša aplikacija nastaviti raditi.

Izrada sheme

Jednostavna shema samo je karta ključeva i vrsta:

To je isto kao i korištenje typesvojstva:

Shema također može biti karta između ključeva i zadanih vrijednosti. Vrste će se automatski zaključiti:

To je ekvivalentno sljedećem:

Da biste saznali više o tome kako pisati sheme, pogledajte Mongoose Schemas.

Raščlanjivanje vrijednosti

Nakon definiranja sheme, pomoću nje možete raščlaniti vrijednosti. Ovaj će postupak pretvoriti vrijednosti u odgovarajuće tipove, kao i primjenom ostalih analizatora definiranih u shemi. To su dostupni parsera: type, default, set, get, trim, uppercase, lowercase.

Rezultat će biti otprilike ovako:

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

Provjera vrijednosti

Baš kao u Mongoose Shemama, i unutar svojih shema možete definirati pravila provjere valjanosti. To su dostupni za provjeru koje: validate, required, match, enum, max, min, maxlength, minlength.

Također možete stvoriti prilagođene raščlanjivače i validatore proširivanjem sheme. O tome ćemo kasnije u ovom članku.

Pogreška provjere valjanosti bit će prema zadanim postavkama niz objekata koji opisuju pogreške.

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

Ako validacija prođe, vratit će se raščlanjene vrijednosti, baš kao i parse().

Sastavljanje više shema

Recimo da imate odvojene sheme opisivanja body, identityi druge stvari, i želite ih sastaviti izgraditi humanshemu. To je tako lako koliko zvuči:

Drugi način za sastavljanje shema je gniježđenje. Shema se može koristiti kao typeunutar druge sheme:

Proširivanje shema

Ovo je dio u kojem schmstvarno svijetli. Možete dodati prilagođene parsere i validatore ili čak zamijeniti zadano ponašanje parsei validatemetode stvaranjem grupa shema.

Skupina sheme je funkcija koja prima prethodnu shemu kao jedini argument. Osim prethodnih params, parsersi validators, objekt sheme ima mergemetodu koja je korisna za funkcije grupa shema za spajanje nove funkcionalnosti u prethodne sheme.

Rezultat gornjeg isječka bit će otprilike ovako:

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

Ako želite ići dalje i naučiti više o tome kako stvoriti prilagođene raščlanjivače, pogledajte kako su ovdje napisani parseri unutar osnovne knjižnice.

Proširivanjem shema možemo stvoriti mnoge vrste stvari. Tako je schmnapisana većina satelitskih knjižnica, poput schm-translate, schm-computed i schm-mongo.

Sad ćemo razgovarati o jednom od njih.

Preimenovanje ključeva vrijednosti

schm-translate je jedna od najjednostavnijih, a istovremeno moćnih satelitskih knjižnica schm. To je nekoliko više od 10 redaka koda komprimiranog u jednu funkciju koja vam omogućuje prevođenje ključeva vrijednosti u vaše ključeve sheme.

Recimo da radite na web aplikaciji koja troši resurse iz REST API-ja. Odjednom, programeri mijenjaju stvari na API-ju, što čini da tijelo odgovora vraća malo drugačiji model od onog koji je klijent očekivao. Umjesto emailsvojstva, sada vraća niz od emails.

Zbog toga će se aplikacija vjerojatno pokvariti. Ako nemate shemu ili bilo koji drugi centralizirani način za rukovanje tim objektom, morat ćete ažurirati svaki dio aplikacije kako bi se prilagodio promjenama na poslužitelju.

Pomoću schmi schm-translate, to se može riješiti promjenom nekoliko redaka koda na samo jednom mjestu:

Rezultat će biti točno onaj koji je vaša aplikacija očekivala prije promjene:

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

Kliknite ovdje da biste vidjeli popis svih paketa

Po čemu se ovo razlikuje od ostalih knjižnica shema?

Često je pitanje razlika između schmi drugih knjižnica, poput Joi i ajv (koja slijedi specifikacije JSON sheme).

U usporedbi s ajv, schmne slijedi neke posebne specifikacije. Umjesto toga, pokušava oponašati API sheme Mongoose. Također, iako ajvima neke značajke raščlanjivanja, ograničene su na zadane vrijednosti i prisilu tipa.

U schm, sposobnost raščlanjivanja vrijednosti na temelju sheme je ono što omogućuje transformiranje niza upita u MongoDB upit, na primjer.

To znači, oboje Joii ajvmože se kombinirati s schm. Možete ga jednostavno proširiti tako da koristi drugu metodu provjere valjanosti:

Hvala vam što ste ovo pročitali!

Ako vam se sviđa i smatra vam korisnim, evo nekoliko stvari koje možete učiniti da biste pokazali svoju podršku:

  • Udario pljesak? gumb na ovom članku nekoliko puta (do 50)
  • Dajte zvjezdicu ⭐️ na GitHubu: //github.com/diegohaz/schm
  • Slijedite me na GitHub-u: //github.com/diegohaz
  • Slijedite me na Twitteru: //twitter.com/diegohaz