Úvod
Keď sa pokúšate dozvedieť o webe
vývoj, väčšinou zistíme, že front-end je podstatne dostupnejší ako back-end. Existuje na to veľa dôvodov, najmä pocit okamžitej spätnej väzby, ktorý pochádza zo zmeny určitého prvku na stránke v kóde a zo zaznamenania zmeny na webe. Táto spätná väzba je často užitočná pre začiatočníkov, pretože im umožňuje upraviť svoj kód a poučiť sa zo svojich chýb. Žiaľ, nie je to tak v prípade backendu: veľakrát je veľa práce venované nastaveniu prostredia vopred a inštalácii závislostí potrebných na to, aby sa na termináli objavila jednoduchá správa „Ahoj svet“. V komunite s otvoreným zdrojovým kódom sa neustále robí veľký pokrok smerom k uľahčeniu procesu vývoja rámcov a zlepšovanie skúseností vývojárov je toho dobrým príkladom. Tento rámec je veľmi schopnou technológiou, ktorá umožňuje písanie na strane servera kód v Javascripte pohodlný a ponúka množstvo vstavaných nástrojov a funkcií, ktoré ho odlišujú od jeho konkurentov. V tomto článku preskúmame NodeJs a jeho ekosystém s praktickým prístupom a vytvoríme plne funkčný projekt.
Čo postavíme?
Aplikácie ToDo sú hlavným projektom pre začiatočníkov, ktorí sa učia front-end vývoj. Preto sme sa rozhodli vytvoriť API zoznamu úloh. To nám umožní pridať stálosť údajov do nášho rozhrania a poskytne nám možnosť manipulovať s týmito údajmi (pridávaním, aktualizáciou, odstraňovaním úloh atď.).
Konečný kód nájdete tu.
Naše nástroje
Pre tento projekt použijeme zjednodušený technologický zásobník. Možno to považovať za minimálnu verziu mnohých nástrojov, ktoré nájdete v projektoch zo skutočného života, dôvodom je, že nápady na vyššej úrovni sú rovnaké. Podrobnosti o implementácii a výbere konkrétneho nástroja pred iným nie sú na začiatok dôležité.
-
NodeJs, ako sme spomenuli, je jedným z najpopulárnejších frameworkov Javascript na vytváranie aplikácií na strane servera.
-
ExpressJs je minimálny rámec Javascript používaný nad NodeJS. Urýchľuje proces vývoja pomocou mnohých vstavaných funkcií. Používa sa tiež ako spôsob štandardizácie vývojových praktík v projektoch NodeJS s cieľom uľahčiť ich použitie pre inžinierov.
-
LowDB je jednoduchá databáza v pamäti. Jeho jednoduchosť nám umožňuje predviesť, ako interagovať s databázou v projekte NodeJs, bez toho, aby sme sa zaoberali pokročilejšími témami, ako sú nasadenia a konfigurácie.
Teraz, keď sme identifikovali všetky nástroje, ktoré budeme používať, poďme k našim klávesniciam a začnime kódovať!
Inštalácia
Uzol je dostupný na všetkých platformách. Všetky inštalačné príručky nájdete na oficiálnej webovej stránke. Používatelia systému Windows by sa mali uistiť, že pridali uzol cesta k premenným prostredia, aby ho bolo možné použiť na príkazovom riadku.
Budeme tiež potrebovať nainštalovaný npm. Npm je štandardný správca balíkov pre NodeJs. Umožní nám to spravovať naše projektové závislosti. Inštalačnú príručku nájdete tu.
Inicializácia projektu
Prejdite na odkaz a naklonujte štartovací projekt:
Toto je jednoduché spúšťacie úložisko pre náš projekt. Obsahuje všetky závislosti, ktoré budeme používať spolu so štruktúrou súboru projektu. Po dosiahnutí vysvetlíme každý prvok. Otvorte terminál, prejdite na cestu projektu a spustite príkaz:
npm install
Týmto sa nainštalujú všetky závislosti projektu špecifikované v súbore package.json. package.json je súbor nachádzajúci sa v koreňovom adresári akéhokoľvek projektu Javascript/NodeJs, obsahuje metadáta o druhom projekte a používa sa na správu všetkých závislostí projektu, skriptov a verzií.
Po nainštalovaní všetkých závislostí môžeme spustiť našu aplikáciu:
npm run start
„start“ je skript, ktorý sme špecifikovali v balíku. súbor json. Špecifikuje vstupný súbor do našej aplikácie, čo je v našom prípade app.js.
Vo vašom termináli by sa teraz mala zobraziť nasledujúca správa:
To znamená, že náš server sa úspešne spustil a počúva všetky požiadavky odoslané na port 3000. Pozrime sa na app.js a vysvetlíme, čo sa tu deje:
App.js je náš vstupný súbor projektu (a jediný v tomto bode). Vytvárame inštanciu expresnej aplikácie s názvom app, špecifikujeme, že všetky požiadavky, ktoré majú http metódu “GET” a podcestu '/' budú spracované touto cestou, odovzdávajú funkciu nazývanú middleware, ktorá prijíma objekt žiadosti a odpovede ako parametre. Toto je kľúčové, pretože požiadavka obsahuje všetky informácie potrebné na jej spracovanie (parametre, telo požiadavky, hlavičky požiadavky atď.) a objekt odpovede je ten, ktorý sa vráti klientovi. Začneme odoslaním správy „Ahoj svet“. Potom prinútime našu aplikáciu počúvať všetky prichádzajúce požiadavky na špecifikovaný port (v našom prípade 3000) a zaznamenáme správu „Počúva sa na porte 3000“, aby sme naznačili, že naša aplikácia je spustená a pripravená prijímať požiadavky.
Otvorte terminál a do panela s odkazmi napíšte „localhost:3000/“ a stlačte Enter. Toto je špecifikovaná cesta, ktorú môžeme použiť na lokálne dosiahnutie nášho servera. Dostanete nasledujúcu správu:
Konfigurácia databázy
Lowdb je open source databáza, ktorá sa ľahko používa a nevyžaduje žiadne špecifické nastavenie. Všeobecnou myšlienkou je ukladať všetky údaje do lokálneho súboru json. Po nainštalovaní LowDB (čo bolo vykonané, keď sme nainštalovali všetky závislosti), môžeme do db.js pridať nasledujúci kód:
Tento kód je dosť podobný kódu, ktorý sa nachádza v oficiálnej dokumentácii LowDB. Trochu sme to upravili pre náš vlastný prípad použitia. Poďme si to vysvetliť riadok po riadku:
Prvých pár riadkov slúži na importovanie potrebných závislostí. „join“ je pomocná funkcia dostupná v module „cesta“. Je to jeden zo základných modulov NodeJs, ktorý ponúka množstvo metód na riešenie a spracovanie ciest. „Low“ a „JSONFile“ sú dve triedy, ktoré odhaľuje LowDB. Prvý vytvorí inštanciu súboru json, ktorá bude obsahovať naše údaje. Druhý vytvorí skutočnú inštanciu databázy, ktorá na ňu bude pôsobiť. Nakoniec, „lodash“ je jednou z najpoužívanejších knižníc javascriptu, ktorá ponúka širokú škálu pomocných funkcií pre bežné programovacie úlohy. Pridávame ho do našej inštancie databázy, aby sme mohli používať jeho pokročilé metódy na spracovanie našich údajov.
Najprv zadáme cestu k súboru db.json. Je to súbor, ktorý bude obsahovať naše údaje a bude odovzdaný do LowDB. Ak sa súbor nenájde na zadanej ceste, LowDB ho vytvorí.
Potom odovzdáme cestu k súboru adaptéru LowDB a odošleme ju našej novej inštancii databázy LowDB. Premenná „db“ sa potom môže použiť na komunikáciu s našou databázou. Po vytvorení inštancie databázy čítame zo súboru json pomocou db.read(). Tým sa nastaví pole „údaje“ v našej inštancii databázy, aby sme mali prístup k obsahu databázy. Všimnite si, že pred týmto riadkom sme „čakali“. Toto má špecifikovať, že vyriešenie tejto inštrukcie môže trvať neznámy čas a že proces NodeJs musí počkať na svoje vykonanie, kým bude pokračovať so zvyškom kódu. Robíme to preto, že operácia čítania vyžaduje prístup do pamäte k určenému súboru a čas na vykonanie tohto druhu operácie závisí od špecifikácií vášho počítača.
Teraz, keď máme prístup k dátovému poľu, nastavíme ho ako objekt obsahujúci prázdne pole príspevkov, alebo skôr skontrolujeme, či súbor obsahuje nejaké predchádzajúce údaje, a ak tomu tak nie je, nastavíme prázdne pole.
Nakoniec spustíme db.write(), aby sme použili úpravy, ktoré sme vykonali na údajoch, a exportujeme inštanciu databázy, aby sa dala použiť v iných súboroch v našom projekte.
Pracovný postup všeobecných požiadaviek/odpovedí
Zvážte nasledujúci diagram:
Ukazuje všeobecnú architektúru aplikovanú v množstve backendových aplikácií vytvorených pomocou NodeJs/Express. Pochopenie všeobecného pracovného postupu za spracovaním požiadavky vám umožní nielen zostaviť a štruktúrovať aplikácie NodeJs, ale tiež vám umožní preniesť tieto koncepty do prakticky akéhokoľvek technického balíka podľa vášho výberu. Preskúmame rôzne vrstvy, ktoré zasahujú do tohto procesu, a vysvetlíme ich úlohy:
## Vrstva žiadosti HTTP
Toto je prvá vrstva v našej aplikácii, predstavte si ju ako bránu, ktorá prijíma širokú škálu rôznych požiadaviek prichádzajúcich od rôznych klientov, každá požiadavka je potom analyzovaná a preposlaná do vyhradenej časti aplikácie, kde sa s ňou zaobchádza.
-
Smerovače: tu máme na mysli smerovače Express, ale tento koncept možno nájsť v mnohých backendových frameworkoch. Smerovače predstavujú spôsob, ako aplikovať logickú distribúciu v našej obchodnej logike na náš kód, čo znamená, že každá skupina prvkov, ktoré zdieľajú podobné funkcie, je spracovaná rovnakou položkou a možno ju oddeliť od ostatných sád. To má výhodu v tom, že každý komponent kódu je nezávislý od ostatných a ľahšie sa udržiava a rozširuje. Konkrétnejšie a ako príklad, všetky požiadavky, ktoré spĺňajú podmienky zdieľanej cesty URL „/posts“, budú spracované rovnakým smerovačom. V závislosti od ich http metódy (GET, POST, atď.) sa použije iný ovládač.
-
Kontroléry: kontrolór prijíma filtrované požiadavky od smerovačov, aplikuje dodatočné spracovanie a volá vhodné servisné metódy.
Vrstva obchodnej logiky
Táto vrstva je jedinečná v závislosti od konkrétnych prípadov použitia aplikácie a obchodnej logiky za ňou.
-
Služby: Služby sú súborom metód, ktoré obsahujú základnú logiku aplikácie. Tiež interagujú s databázou pomocou ORM/ODM.).
-
Služby tretích strán: mnohé moderné aplikácie sa rozhodnú delegovať časť logiky aplikácie na špecializované služby prístupné prostredníctvom rozhrania API. Služby tohto druhu môžu byť služby spracovania platieb, ukladanie statických súborov, upozornenia a iné.
-
ODM/ORM: ORM a ODM pôsobia ako sprostredkovatelia medzi službami a databázou. Ich úlohou je poskytovať vysokoúrovňovú abstrakciu databázy, ktorá umožňuje vývojárom písať kód v programovacom jazyku podľa vlastného výberu namiesto špecializovaných databázových jazykov, ako je SQL.
Vrstva perzistencie údajov
- Databázy: ako sme už spomenuli, takmer všetky aplikácie potrebujú určitú formu perzistencie údajov. Táto časť je spracovaná databázami a v závislosti od povahy údajov, obchodnej logiky a mnohých ďalších úvah sa výber určitej databázy pred inou považuje za kľúčovú pre efektivitu a škálovateľnosť aplikácie.
Príklad: Pridanie príspevku
Teraz, keď sme pochopili všeobecnú myšlienku architektúry, aplikujme ju na náš jednoduchý príklad. Implementujeme funkciu pridania príspevku o úlohe do našej aplikácie. Predpokladajme, že každý príspevok má jedinečné ID, ktoré nám umožní neskôr ho identifikovať v našej databáze, názov, ktorý je reťazcom, a objednávku, ktorá je typu celé číslo. Podľa nášho diagramu začneme implementáciou smerovača. Pridajte nasledujúci kód do súboru index.js:
Toto je súbor nášho smerovača. Importujeme expresnú metódu a metódu „addPost“ z nášho kontroléra (tento spôsob implementujeme čoskoro), vytvoríme inštanciu expresného smerovača a naviažeme metódu addPost na náš smerovač – čo znamená, že pre každú požiadavku, ktorá má koreňovú cestu a http metódu „POST“, zavolá sa metóda „addPost“, ktorá to zvládne.
Predtým, ako implementujeme našu metódu do ovládača, odkážeme na nový smerovač v našom hlavnom súbore app.js a špecifikujeme jeho cestu ako „/posts“: Všetky cesty so zadanými cestami budú preposlané tomuto smerovaču, aby sa s nimi dalo manipulovať. rôznymi spôsobmi ovládača:
Importujeme router a pomenujeme ho ako „príspevky“. app.use("/posts",..) znamená, že všetky požiadavky s podcestou "/posts", bez ohľadu na ich http metódu, budú smerované na určený router.
Medzi ďalšie zmeny v app.js patrí importovanie konfiguračného súboru databázy, aby sa mohol spustiť, a použitie express.json() ako middleware, ktorý nám umožní prístup k objektu tela požiadavky.
Teraz, keď sú naše trasy nastavené, môžeme pridať metódu „addPost“ do súboru controller.js:
„addPost“ je midlvérová funkcia, ktorá berie ako parametre požiadavku, objekty odpovede a ďalšiu funkciu. Keď je zavolaná ďalšia funkcia, proces sa presunie na ďalší middleware v reťazci alebo ukončí požiadavku. V kóde metódy extrahujeme názov a objednávku z tela požiadavky a odovzdáme ich ako parametre do servisnej funkcie „createPost“. Táto funkcia prevezme atribúty príspevku, vytvorí nový príspevok a vráti ho. Po vytvorení nového príspevku ho vrátime klientovi spolu so stavovým kódom 200, čo znamená, že požiadavka bola úspešná. Môžete si všimnúť, že náš kód je vložený do bloku try/catch, aby zachytil akúkoľvek neočakávanú chybu a odovzdal ho ďalšiemu middlewaru. Za najlepšiu prax sa považuje pripojiť ku všetkým smerovačom middleware na spracovanie chýb, ktorý extrahuje chybu a vráti klientovi zmysluplnú chybovú správu.
Teraz už zostáva len implementovať funkciu „createPost“ v service.js:
Ako sme už spomenuli pri vysvetľovaní rôznych vrstiev architektúry, vrstva služieb interaguje s riešením ukladania údajov pomocou ORM/ODM. V našom príklade však nebudeme musieť používať samostatný ORM, pretože Lowdb prichádza so vstavanou podporou pre Javascript. Všetky podrobnosti o jeho syntaxi nájdete v dokumentácii.
Metóda „createPost“ prijíma názov a poradie ako parametre a používa ich na vytvorenie objektu príspevku. Pre jedinečné ID používame vyhradenú knižnicu s názvom „nanoid“, ktorá generuje jedinečnú sekvenciu znakov. Nový príspevok pridáme do poľa príspevkov v databáze a zapíšeme tieto zmeny; nový príspevok potom funkcia vráti.
Teraz, keď je „createPost“ pripravený, funkcia pridávania príspevkov je dokončená a spustená. Testujeme to pomocou Postman, obľúbeného nástroja na testovanie API:
Ako metódu http pre požiadavku vyberieme „POST“ spolu so zadanou cestou adresy URL „localhost:3000/posts“. Do sekcie tela pridáme názov a objednávku vo formáte json a odošleme požiadavku. Ako je uvedené vyššie, spolu s novovytvoreným príspevkom dostávame stav 200 OK.
Záver
V tomto projekte sa preskúmalo veľa konceptov a nápadov: Zaoberali sme sa tým, ako nainštalovať a nastaviť naše projektové prostredie, naučili sme sa, ako nakonfigurovať LowDB pre lokálnu perzistenciu údajov, preskúmali sme všeobecnú architektúru backendových aplikácií NodeJS/Express a videli sme, ako aplikujte to na jednoduchom príklade. Nakoniec sme našu aplikáciu otestovali pomocou Postmana.
Zámerom tu bolo odhaliť zjednodušenú verziu všetkého, čo sa týka vytvárania moderných backendových aplikácií. Ako sme už videli, NodeJs je výkonný nástroj, ktorý nám umožňuje vytvárať jednoduché a zložité API. V kombinácii s bohatým ekosystémom rámcov, ako je express a množstvom nástrojov a knižníc pre takmer akýkoľvek prípad použitia, ide o legitímne riešenie pre moderný backendový vývoj – riešenie, ktoré odporúčame naučiť sa a ovládať.