Uvod
Ko poskušate spoznati splet
razvoja običajno ugotovimo, da je front-end bistveno bolj dostopen kot back-end. Razlogov za to je veliko, zlasti občutek takojšnje povratne informacije, ki izhaja iz spremembe določenega elementa strani v kodi, in opazovanja spremembe, uporabljene na spletnem mestu. Te povratne informacije so pogosto koristne za začetnike, saj jim omogočajo, da prilagodijo svojo kodo in se učijo iz svojih napak. Na žalost ni tako pri zaledju: pogosto je veliko dela namenjenega vnaprejšnji nastavitvi okolja in namestitvi odvisnosti, ki so potrebne, da se na terminalu prikaže preprosto sporočilo »Hello World«. Na srečo, je v odprtokodni skupnosti dosežen velik napredek v smeri olajšanja razvoja ogrodij in izboljšanje izkušenj razvijalcev je dober primer tega ogrodja, ki omogoča pisanje na strani strežnika kodo v Javascriptu in ponuja vrsto vgrajenih orodij in funkcij, po katerih se razlikuje od konkurentov. V tem članku bomo raziskali NodeJs in njegov ekosistem s praktičnim pristopom ter zgradili popolnoma delujoč projekt.
Kaj bomo zgradili?
Aplikacije ToDo so projekt za začetnike, ki se učijo front-end razvoja. Zato smo se odločili zgraditi API seznama opravil. To nam bo omogočilo, da našemu vmesniku dodamo obstojnost podatkov in nam bo dalo možnost manipuliranja s temi podatki (z dodajanjem, posodabljanjem, brisanjem opravil itd.).
Končno kodo lahko najdete tukaj.
Naša orodja
Za ta projekt bomo uporabili poenostavljen tehnološki sklad. Lahko se šteje za minimalno različico številnih orodij, ki jih boste našli v realnih projektih, razlog pa je, da so ideje na višji ravni enake. Podrobnosti izvedbe in izbira določenega orodja pred drugim niso pomembne za začetek.
-
NodeJs, kot smo omenili, je eno najbolj priljubljenih ogrodij Javascript za izdelavo aplikacij na strani strežnika.
-
ExpressJs je minimalno ogrodje Javascript, ki se uporablja poleg NodeJS. Pospeši razvojni proces z uporabo številnih vgrajenih funkcij. Uporablja se tudi kot način za standardizacijo razvojnih praks v projektih NodeJS, da bi inženirjem olajšali njegovo uporabo.
-
LowDB je preprosta baza podatkov v pomnilniku. Njegova preprostost nam omogoča, da predstavimo, kako komunicirati z bazo podatkov v projektu NodeJs, ne da bi se ukvarjali z naprednejšimi temami, kot so uvedbe in konfiguracije.
Zdaj, ko smo identificirali vsa orodja, ki jih bomo uporabljali, se lotimo naših tipkovnic in začnimo kodirati!
Namestitev
Node je na voljo na vseh platformah. Vse vodnike za namestitev najdete na uradni spletni strani. Uporabniki sistema Windows morajo dodati vozlišče pot do spremenljivk okolja, da ga je mogoče uporabiti v ukazni vrstici.
Potrebovali bomo tudi nameščen npm. Npm je standardni upravitelj paketov za NodeJs. Omogočil nam bo upravljanje naših projektnih odvisnosti. Navodila za namestitev najdete tukaj.
Inicializacija projekta
Pojdite na povezavo in klonirajte začetni projekt:
To je preprosto začetno skladišče za naš projekt. Vsebuje vse odvisnosti, ki jih bomo uporabili skupaj s strukturo projektne datoteke. Vsak element bomo razložili, ko ga dosežemo. Odprite terminal, se pomaknite na pot do projekta in zaženite ukaz:
npm install
S tem boste namestili vse odvisnosti projekta, navedene v datoteki package.json. package.json je datoteka, ki jo najdete v korenu katerega koli projekta Javascript/NodeJs, vsebuje metapodatke o slednjem in se uporablja za upravljanje vseh odvisnosti projekta, skriptov in različic.
Ko so vse odvisnosti nameščene, lahko zaženemo našo aplikacijo:
npm run start
“start” je skript, ki smo ga določili v paketu. json datoteko. Določa vstopno datoteko v našo aplikacijo, ki je v našem primeru app.js.
V vašem terminalu bi se moralo zdaj prikazati naslednje sporočilo:
To pomeni, da se je naš strežnik uspešno zagnal in posluša vse zahteve, poslane na vrata 3000. Poglejmo app.js in razložimo, kaj se tukaj dogaja:
App.js je vnosna datoteka našega projekta (in edina na tej točki). Instanciramo ekspresno aplikacijo z imenom app, določimo, da bodo vse zahteve, ki imajo http metodo »GET« in podpot '/', obravnavane po tej poti, posredujemo funkcijo, imenovano vmesna programska oprema, ki sprejme objekt zahteve in odgovora kot parametri. To je ključnega pomena, saj zahteva vsebuje vse informacije, potrebne za njeno obravnavo (parametri, telo zahteve, glave zahteve itd.), odgovorni objekt pa je tisti, ki bo vrnjen odjemalcu. Začnemo tako, da preprosto pošljemo sporočilo »Hello world«. Po tem naredimo, da naša aplikacija posluša vse dohodne zahteve na navedena vrata (v našem primeru 3000) in zabeleži sporočilo »Poslušanje vrat 3000«, ki nakazuje, da je naša aplikacija pripravljena in pripravljena na sprejemanje zahtev.
Odprite terminal in v vrstico s povezavami vnesite »localhost:3000/« in pritisnite Enter. To je navedena pot, ki jo lahko uporabimo za lokalno doseganje našega strežnika. Prejeli boste naslednje sporočilo:
Konfiguracija baze podatkov
Lowdb je odprtokodna zbirka podatkov, ki je enostavna za uporabo in ne zahteva posebne nastavitve. Splošna ideja za njim je shranjevanje vseh podatkov v lokalno datoteko json. Ko je LowDB nameščen (kar je bilo storjeno, ko smo namestili vse odvisnosti), lahko v db.js dodamo naslednjo kodo:
Ta koda je precej podobna tisti, ki jo najdete v uradni dokumentaciji LowDB. Malce smo ga prilagodili za naš primer uporabe. Razložimo vrstico za vrstico:
Prvih nekaj vrstic je za uvoz potrebnih odvisnosti. »Join« je pomožna funkcija, ki je na voljo v modulu »path«. Je eden od osrednjih modulov NodeJs, ki ponuja veliko metod za obravnavo in upravljanje poti. »Low« in »JSONFile« sta dva razreda, ki ju izpostavi LowDB. Prvi ustvari primerek datoteke json, ki bo vseboval naše podatke. Drugi ustvari dejanski primerek baze podatkov, ki bo deloval na njej. Nazadnje je »lodash« ena najpogosteje uporabljenih knjižnic javascript, ki ponuja široko paleto uporabnih funkcij za pogosta programska opravila. Dodamo ga v naš primerek baze podatkov, da nam omogoči uporabo njegovih naprednih metod za obdelavo naših podatkov.
Najprej določimo pot do datoteke db.json. To je datoteka, ki bo vsebovala naše podatke in bo posredovana LowDB. Če datoteke ni mogoče najti na navedeni poti, jo bo LowDB ustvaril.
Nato posredujemo pot datoteke adapterju LowDB in jo posredujemo našemu novemu primerku baze podatkov LowDB. Spremenljivko »db« lahko nato uporabimo za komunikacijo z našo bazo podatkov. Ko je primerek baze podatkov ustvarjen, beremo iz datoteke json z uporabo db.read(). To bo nastavilo polje »podatki« v naši instanci baze podatkov, da bomo lahko dostopali do vsebine baze podatkov. Upoštevajte, da smo pred to vrstico postavili "počakaj". To določa, da lahko razrešitev tega navodila traja neznano količino časa in da mora proces NodeJs počakati na izvedbo, preden nadaljuje s preostalo kodo. To počnemo, ker operacija branja zahteva dostop do pomnilnika do navedene datoteke, čas za izvedbo te vrste operacije pa je odvisen od specifikacij vašega računalnika.
Sedaj, ko imamo dostop do podatkovnega polja, ga nastavimo kot objekt, ki vsebuje prazno matriko objav, oziroma preverimo, ali datoteka vsebuje predhodne podatke in nastavimo prazno matriko, če ni.
Nazadnje izvedemo db.write(), da uporabimo spremembe, ki smo jih naredili v podatkih, in izvozimo primerek baze podatkov, da ga lahko uporabimo v drugih datotekah v našem projektu.
Splošni potek dela zahteve/odgovora
Razmislite o naslednjem diagramu:
Prikazuje splošno arhitekturo, uporabljeno v množici zalednih aplikacij, izdelanih z NodeJs/Express. Razumevanje splošnega poteka dela za obravnavanjem zahteve vam ne bo omogočilo le gradnje in strukturiranja aplikacij NodeJs, temveč vam bo omogočilo tudi prenos teh konceptov v praktično kateri koli tehnični sklad po vaši izbiri. Raziskali bomo različne plasti, ki motijo ta proces, in razložili njihove vloge:
## Sloj zahteve HTTP
To je prva plast v naši aplikaciji. Predstavljajte si jo kot prehod, ki sprejema široko paleto različnih zahtevkov, ki prihajajo od različnih strank, vsaka zahteva se nato analizira in posreduje v namenski del aplikacije, kjer se obravnava.
-
Usmerjevalniki: tukaj mislimo na usmerjevalnike Express, vendar je ta koncept mogoče najti v številnih zalednih okvirih. Usmerjevalniki so način za uporabo logične distribucije v naši poslovni logiki za našo kodo, kar pomeni, da vsak niz elementov, ki imajo podobne funkcije, obravnava isti vnos in ga je mogoče ločiti od preostalih nizov. Prednost tega je, da je vsaka komponenta kode neodvisna od drugih ter enostavnejša za vzdrževanje in razširitev. Natančneje in kot primer, vse zahteve, ki izpolnjujejo pogoje skupne poti url »/posts«, bo obravnaval isti usmerjevalnik. Odvisno od njihove metode http (GET, POST itd.), bo uporabljen drug krmilnik.
-
Krmilniki: krmilnik sprejema filtrirane zahteve od usmerjevalnikov, uporablja dodatno obdelavo in kliče ustrezne storitvene metode.
Plast poslovne logike
Ta plast je edinstvena glede na specifične primere uporabe aplikacije in poslovno logiko, ki stoji za njo.
-
Storitve: Storitve so nabor metod, ki vsebujejo osnovno logiko aplikacije. Z bazo podatkov sodelujejo tudi z uporabo ORM-jev/ODM-jev.
-
Storitve tretjih oseb: številne sodobne aplikacije se odločijo, da del logike aplikacije prenesejo na namenske storitve, dostopne prek API-ja. Tovrstne storitve so lahko plačilne storitve, shranjevanje statičnih datotek, obvestila in druge.
-
ODM/ORM: ORM-ji in ODM-ji delujejo kot posredniki med storitvami in bazo podatkov. Njihova vloga je zagotoviti visokonivojsko abstrakcijo v zbirki podatkov, ki razvijalcu omogoča pisanje kode v programskem jeziku po lastni izbiri namesto namenskih jezikov baze podatkov, kot je SQL.
Plast obstojnosti podatkov
- Baze podatkov: kot smo že omenili, skoraj vse aplikacije potrebujejo neko obliko obstojnosti podatkov. Za ta del skrbijo podatkovne baze in glede na naravo podatkov, poslovno logiko in številne druge dejavnike je izbira ene baze podatkov pred drugo ključna za učinkovitost in razširljivost aplikacije.
Primer: Dodajanje objave
Zdaj, ko razumemo splošno idejo za arhitekturo, jo uporabimo na našem preprostem primeru. Izvedli bomo funkcijo dodajanja objave opravil v našo aplikacijo. Predpostavimo, da ima katera koli objava edinstven ID, ki nam bo omogočil, da jo pozneje identificiramo v naši bazi podatkov, naslov, ki je niz, in vrstni red, ki je tipa celo število. Po našem diagramu bomo začeli z implementacijo usmerjevalnika. V datoteko index.js dodajte naslednjo kodo:
To je datoteka našega usmerjevalnika. Uvozimo ekspresno metodo in metodo »addPost« iz našega krmilnika (to bomo implementirali v kratkem), ustvarimo primerek ekspresnega usmerjevalnika in povežemo metodo addPost z našim usmerjevalnikom – kar pomeni, da za vsako zahtevo, ki ima korensko pot in http metoda “POST”, bo za obdelavo poklicana metoda “addPost”.
Preden implementiramo našo metodo v krmilnik, se sklicujemo na novi usmerjevalnik v naši glavni datoteki app.js in podamo njegovo pot kot »/posts«: Vse poti z navedenimi potmi bodo posredovane temu usmerjevalniku, tako da jih je mogoče obravnavati z različnimi metodami krmilnika:
Usmerjevalnik uvozimo in ga poimenujemo »posts«. app.use(“/posts”,..) pomeni, da bodo vse zahteve s podpotjo “/posts”, ne glede na njihovo metodo http, usmerjene na navedeni usmerjevalnik.
Druge spremembe app.js vključujejo uvoz konfiguracijske datoteke baze podatkov, da se lahko izvede, in uporabo express.json() kot vmesne programske opreme, ki nam omogoča dostop do predmeta telesa zahteve.
Zdaj, ko so naše poti nastavljene, lahko dodamo metodo »addPost« v datoteko controller.js:
»addPost« je funkcija vmesne programske opreme, ki kot parametre sprejme zahtevo, objekte odgovora in naslednjo funkcijo. Ko se pokliče naslednja funkcija, se proces premakne na naslednjo vmesno programsko opremo v verigi ali konča zahtevo. V kodi metode izvlečemo naslov in vrstni red iz telesa zahteve in ju posredujemo kot parametre storitveni funkciji »createPost«. Ta funkcija vzame atribute objave, ustvari novo objavo in jo vrne. Ko je nova objava ustvarjena, jo vrnemo naročniku skupaj s statusno kodo 200, kar pomeni, da je bila zahteva uspešna. Morda boste opazili, da je naša koda postavljena v blok poskusi/ulovi, da ujame vsako nepričakovano napako in jo posreduje naslednji vmesni programski opremi. Velja za najboljšo prakso, da vsem usmerjevalnikom priključite vmesno programsko opremo za obravnavanje napak, ki izloči napako in odjemalcu vrne smiselno sporočilo o napaki.
Vse, kar je zdaj ostalo, je implementacija funkcije “createPost” v service.js:
Kot smo že omenili pri razlagi različnih plasti arhitekture, storitvena plast sodeluje z rešitvijo za shranjevanje podatkov z uporabo ORM/ODM. Vendar nam v našem primeru ne bo treba uporabiti ločenega ORM-ja, saj ima Lowdb vgrajeno podporo za Javascript. Vse podrobnosti o sintaksi so na voljo v dokumentaciji.
Metoda “createPost” prejme naslov in vrstni red kot parametra in ju uporabi za ustvarjanje objekta objave. Za edinstveni ID uporabljamo namensko knjižnico, imenovano »nanoid«, ki generira edinstveno zaporedje znakov. Novo objavo dodamo v matriko objav v bazi podatkov in zapišemo te spremembe; funkcija nato vrne novo objavo.
Zdaj, ko je »createPost« pripravljen, je funkcija dodajanja objav končana in deluje. Testiramo ga s pomočjo Postmana, priljubljenega orodja za testiranje API-jev:
Kot metodo http za zahtevo izberemo »POST« skupaj z navedeno potjo URL »localhost:3000/posts«. Naslov in vrstni red dodamo v obliki json v razdelek body in pošljemo zahtevo. Kot je prikazano zgoraj, prejmemo status 200 OK skupaj z novo ustvarjeno objavo.
Zaključek
V tem projektu je bilo raziskanih veliko konceptov in idej: Pokrili smo, kako namestiti in nastaviti naše projektno okolje, se naučili, kako konfigurirati LowDB za lokalno obstojnost podatkov, raziskali splošno arhitekturo zalednih aplikacij NodeJS/Express in videli, kako uporabite na preprostem primeru. Na koncu smo preizkusili našo aplikacijo s programom Postman.
Namen tukaj je bil izpostaviti poenostavljeno različico vsega, kar gre za gradnjo sodobnih zalednih aplikacij. Kot smo že videli, je NodeJs zmogljivo orodje, ki nam omogoča izdelavo preprostih in kompleksnih API-jev. V kombinaciji s svojim bogatim ekosistemom ogrodij, kot je express, ter množico orodij in knjižnic za skoraj vse primere uporabe, je zakonita rešitev za sodoben razvoj zaledja – rešitev, ki jo priporočamo, da se jo naučite in obvladate.