Panimula sa NodeJs

nodejs
javascript
server
Panimula sa NodeJs cover image

Panimula

Kapag sinusubukang matuto tungkol sa web

pag-unlad, karaniwan naming nalaman na ang front-end ay higit na naa-access kaysa sa back-end. Mayroong maraming mga dahilan para dito, lalo na ang pakiramdam ng instant na feedback na nagmumula sa pagbabago ng isang partikular na elemento ng isang page sa code, at napansin ang pagbabagong inilalapat sa website. Ang feedback na ito ay kadalasang nakakatulong para sa mga nagsisimula, dahil binibigyang-daan sila nitong ayusin ang kanilang code at matuto mula sa kanilang mga pagkakamali. Sa kasamaang-palad, hindi ito ang kaso sa backend: madalas, malaking halaga ng trabaho ang nakatuon sa pag-set up ng kapaligiran nang maaga, at pag-install ng mga dependency na kailangan upang makakuha ng isang simpleng "Hello World" na mensahe na lumabas sa terminal. Sa kabutihang-palad, maraming progreso ang patuloy na ginagawa sa open-source na komunidad tungo sa pagpapadali sa proseso ng pagbuo ng mga frameworks, at ang pagpapabuti ng karanasan ng developer ay isang magandang halimbawa nito code sa Javascript na maginhawa, at nag-aalok ng iba't ibang mga built-in na tool at feature na nagpapaiba nito sa mga kakumpitensya nito Sa artikulong ito, tutuklasin natin ang mga NodeJ at ang ecosystem nito, na may hands-on na diskarte, na bumubuo ng isang ganap na gumaganang proyekto.

Ano ang itatayo natin?

Ang mga application ng ToDo ay isang go-to na proyekto para sa mga nagsisimula sa pag-aaral ng front-end development. Ito ang dahilan kung bakit nagpasya kaming bumuo ng Todo list API. Ito ay magbibigay-daan sa amin upang magdagdag ng pagtitiyaga ng data sa aming interface, at bigyan kami ng kakayahang manipulahin ang data na ito (sa pamamagitan ng pagdaragdag, pag-update, pagtanggal ng mga todos, atbp…).

Ang huling code ay makikita dito.

Ang aming mga kasangkapan

Gagamit kami ng pinasimpleng tech stack para sa proyektong ito. Maaari itong ituring bilang isang minimal na bersyon ng maraming tool na makikita mo sa mga proyekto sa totoong buhay, ang dahilan ay pareho ang mga ideya sa mas mataas na antas. Ang mga detalye ng pagpapatupad at pagpili ng isang partikular na tool sa iba ay hindi mahalaga upang makapagsimula.

  • Ang mga NodeJ, tulad ng nabanggit namin ay isa sa pinakasikat na mga framework ng Javascript para sa pagbuo ng mga application sa gilid ng server.

  • Ang ExpressJs ay isang minimal na balangkas ng Javascript na ginamit sa itaas ng NodeJS. Pinapabilis nito ang proseso ng pagbuo sa pamamagitan ng paggamit ng maraming built-in na feature. Ginagamit din ito bilang isang paraan upang i-standardize ang mga kasanayan sa pag-unlad sa mga proyekto ng NodeJS upang mapadali ang paggamit nito para sa mga inhinyero.

  • Ang LowDB ay isang simpleng in-memory database. Ang pagiging simple nito ay nagbibigay-daan sa amin na ipakita kung paano makipag-ugnayan sa isang database sa isang proyekto ng NodeJs, nang hindi nakikitungo sa mas advanced na mga paksa tulad ng mga deployment at configuration.

Ngayong natukoy na natin ang lahat ng tool na gagamitin natin, pumunta tayo sa ating mga keyboard at magsimulang mag-coding!

Pag-install

Available ang node sa lahat ng platform. Ang lahat ng mga gabay sa pag-install ay matatagpuan sa opisyal na website. Dapat tiyakin ng mga user ng Windows na magdagdag ng node path to environment variable para magamit ito sa command line.

Kakailanganin din namin na naka-install ang npm. Ang Npm ay ang karaniwang manager ng package para sa mga NodeJ. Ito ay magbibigay-daan sa amin na pamahalaan ang aming mga dependency sa proyekto. Ang gabay sa pag-install ay matatagpuan dito.

Pagsisimula ng proyekto

Tumungo sa link at i-clone ang starter project:

Ito ay isang simpleng starter repository para sa aming proyekto. Naglalaman ito ng lahat ng mga dependency na gagamitin namin kasama ng istraktura ng file ng proyekto. Ipapaliwanag namin ang bawat elemento kapag naabot na. Buksan ang iyong terminal, mag-navigate sa landas ng proyekto at patakbuhin ang command:

npm install

Ito ay mag-i-install ng lahat ng mga dependency ng proyekto na tinukoy sa package.json file. package.json ay ang file na matatagpuan sa ugat ng anumang proyekto ng Javascript/NodeJs, naglalaman ito ng metadata tungkol sa huli at ginagamit upang pamahalaan ang lahat ng mga dependency ng proyekto, mga script, at mga bersyon.

Matapos mai-install ang lahat ng dependency, maaari na nating simulan ang ating aplikasyon:

npm run start

Ang "simula" ay isang script na tinukoy namin sa package. json file. Tinutukoy nito ang entry file sa aming application, na sa aming kaso ay app.js.

Ang sumusunod na mensahe ay dapat na ngayong lumitaw sa iyong terminal:

nodejs_1

Nangangahulugan ito na matagumpay na nagsimula ang aming server, at nakikinig sa anumang mga kahilingang ipinadala sa port 3000. Tingnan natin ang app.js at ipaliwanag kung ano ang nangyayari dito:

nodejs_2

Ang App.js ay ang aming project entry file (at ang isa lamang sa puntong ito). Gumagawa kami ng isang express application na pinangalanang app, tukuyin na ang lahat ng mga kahilingan na mayroong http method na "GET" at ang subpath na '/' ay hahawakan ng rutang ito, pumasa sa isang function na tinatawag na middleware, na kumukuha ng request at response object bilang mga parameter. Mahalaga ito, dahil ang kahilingan ay naglalaman ng lahat ng impormasyong kailangan para ito ay mahawakan (mga parameter, katawan ng kahilingan, mga header ng kahilingan, atbp.), at ang object ng tugon ay ang isa na ibabalik sa kliyente. Magsisimula tayo sa pamamagitan lamang ng pagpapadala ng "Hello world" na mensahe. Pagkatapos nito, pinakikinggan namin ang aming aplikasyon sa anumang mga papasok na kahilingan sa tinukoy na port (sa aming kaso 3000), at i-log ang mensaheng "Pakikinig sa port 3000" upang ipahiwatig na ang aming aplikasyon ay gumagana at handa nang tumanggap ng mga kahilingan.

Buksan ang iyong terminal at sa link bar i-type ang “localhost:3000/”, at pindutin ang Enter. Ito ang tinukoy na landas na magagamit namin upang maabot ang aming server nang lokal. Matatanggap mo ang sumusunod na mensahe:

nodejs_3

Pag-configure ng database

Ang Lowdb ay isang open-source na database na madaling gamitin, at hindi nangangailangan ng partikular na setup. Ang pangkalahatang ideya sa likod nito ay ang pag-imbak ng lahat ng data sa isang lokal na json file. Pagkatapos mai-install ang LowDB (na nagawa nang na-install namin ang lahat ng dependencies), maaari naming idagdag ang sumusunod na code sa db.js:

nodejs_4

Ang code na ito ay halos kapareho sa isa na matatagpuan sa opisyal na dokumentasyon ng LowDB. Binago namin ito ng kaunti para sa sarili naming use case. Ipaliwanag natin ito ng linya sa linya:

Ang unang ilang linya ay para sa pag-import ng mga kinakailangang dependencies. Ang “join” ay isang utility function na available sa “path” module. Ito ay isa sa mga pangunahing module ng NodeJs na nag-aalok ng maraming pamamaraan para sa pagharap, at paghawak ng mga landas. Ang "Mababa" at "JSONFile'' ay ang dalawang klase na inilantad ng LowDB. Ang una ay lumilikha ng halimbawa ng json file na maglalaman ng aming data. Ang pangalawa ay lumilikha ng aktwal na halimbawa ng database na kikilos dito. Sa wakas, ang "lodash" ay isa sa mga pinaka ginagamit na library ng javascript na nag-aalok ng malawak na iba't ibang mga function ng utility para sa mga karaniwang gawain sa programming. Idinaragdag namin ito sa aming instance ng database para magamit namin ang mga advanced na pamamaraan nito para pangasiwaan ang aming data.

Una, tinukoy namin ang path para sa db.json file. Ito ang file na maglalaman ng aming data, at ipapasa sa LowDB. Kung ang file ay hindi natagpuan sa tinukoy na landas, ang LowDB ay gagawa ng isa.

Pagkatapos ay ipapasa namin ang landas ng file sa adaptor ng LowDB, at ipapasa ito sa aming bagong halimbawa ng database ng LowDB. Ang variable na "db" ay maaaring gamitin upang makipag-ugnayan sa aming database. Kapag nagawa na ang database instance, nagbabasa kami mula sa json file sa pamamagitan ng paggamit ng db.read(). Itatakda nito ang field na "data" sa aming database instance para ma-access namin ang nilalaman ng database. Pansinin na inunahan namin ang linyang ito ng "naghihintay". Ito ay upang tukuyin na ang pagtuturo na ito ay maaaring tumagal ng hindi kilalang tagal ng oras upang malutas, at ang proseso ng NodeJs ay dapat maghintay para sa pagpapatupad nito bago magpatuloy sa natitirang bahagi ng code. Ginagawa namin ito dahil ang operasyon ng pagbabasa ay nangangailangan ng access sa memorya sa tinukoy na file, at ang oras upang maisagawa ang ganitong uri ng operasyon ay depende sa mga detalye ng iyong makina.

Ngayon na mayroon na kaming access sa field ng data, itinakda namin ito bilang isang bagay na naglalaman ng isang walang laman na hanay ng mga post, o sa halip, tinitingnan namin kung ang file ay naglalaman ng anumang naunang data at itinakda ang walang laman na array kung hindi ito ang kaso.

Panghuli, isinasagawa namin ang db.write() upang ilapat ang mga pagbabagong ginawa namin sa data, at i-export ang instance ng database upang magamit ito sa iba pang mga file sa aming proyekto.

Daloy ng trabaho sa Pangkalahatang Kahilingan/Tugon

Isaalang-alang ang sumusunod na diagram:

nodejs_5

Ipinapakita nito ang pangkalahatang arkitektura na inilapat sa isang kalabisan ng mga backend na application na binuo gamit ang NodeJs/Express. Ang pag-unawa sa pangkalahatang daloy ng trabaho sa likod ng paghawak ng isang kahilingan ay hindi lamang magbibigay-daan sa iyong bumuo at magbalangkas ng mga application ng NodeJs, ngunit magbibigay-daan din sa iyo na ilipat ang mga konseptong ito sa halos anumang teknikal na stack na gusto mo. Susuriin namin ang iba't ibang mga layer na nakakasagabal sa prosesong ito, at ipaliwanag ang kanilang mga tungkulin:

## Layer ng Kahilingan sa HTTP

Ito ang unang layer sa aming aplikasyon, isipin ito bilang isang gateway na tumatanggap ng malawak na hanay ng iba't ibang mga kahilingan na nagmumula sa iba't ibang mga kliyente, ang bawat kahilingan ay sinuri at ipinapasa sa nakalaang bahagi ng aplikasyon para ito ay mapangasiwaan.

  • Mga Router: dito tinutukoy namin ang mga Express router, ngunit ang konseptong ito ay matatagpuan sa maraming backend frameworks. Ang mga router ay isang paraan upang ilapat ang lohikal na pamamahagi sa aming lohika ng negosyo sa aming code, ibig sabihin, ang bawat hanay ng mga elemento na nagbabahagi ng mga katulad na tampok ay pinangangasiwaan ng parehong entry, at maaaring ihiwalay mula sa iba pang mga hanay. Ito ay may pakinabang na gawing independyente ang bawat bahagi ng code mula sa iba, at mas madaling mapanatili at mapalawak. Higit na partikular, at bilang isang halimbawa, ang lahat ng mga kahilingan na tumutupad sa mga kundisyon ng nakabahaging url path na "/posts" ay hahawakan ng parehong router. Depende sa kanilang http method (GET, POST, etc.. ), ibang controller ang gagamitin.

  • Mga Controller: ang isang controller ay tumatanggap ng mga na-filter na kahilingan mula sa mga router, naglalapat ng karagdagang pagpoproseso, at tumatawag sa mga angkop na pamamaraan ng serbisyo.

Business Logic Layer

Ang layer na ito ay natatangi depende sa mga partikular na kaso ng paggamit ng application, at ang lohika ng negosyo sa likod nito.

  • Mga Serbisyo: Ang mga serbisyo ay isang hanay ng mga pamamaraan na naglalaman ng pangunahing lohika ng application. Nakikipag-ugnayan din sila sa database sa pamamagitan ng paggamit ng ORMs/ODMs.).

  • Mga serbisyo ng third-party: pinipili ng maraming modernong application na italaga ang isang bahagi ng lohika ng application sa mga nakalaang serbisyong naa-access sa pamamagitan ng API. Ang mga serbisyo ng ganitong uri ay maaaring mga serbisyo sa paghawak ng pagbabayad, imbakan ng mga static na file, mga notification, at iba pa.

  • ODM/ORM: Ang mga ORM at ODM ay nagsisilbing middlemen sa pagitan ng mga serbisyo at ng database. Ang kanilang tungkulin ay magbigay ng mataas na antas na abstraction sa isang database na nagpapahintulot sa isang developer na magsulat ng code sa programming language na kanilang pinili sa halip na mga nakalaang wika sa database, tulad ng SQL.

Data Persistence Layer

  • Mga database: tulad ng nabanggit namin kanina, halos lahat ng mga application ay nangangailangan ng ilang anyo ng pagtitiyaga ng data. Ang bahaging ito ay pinangangasiwaan ng mga database, at depende sa likas na katangian ng data, lohika ng negosyo, at maraming iba pang mga pagsasaalang-alang, ang pagpili ng isang partikular na database sa iba ay itinuturing na mahalaga para sa kahusayan at scalability ng application.

Halimbawa: Pagdaragdag ng Post

Ngayong naiintindihan na natin ang pangkalahatang ideya sa likod ng arkitektura, ilapat natin ito sa ating simpleng halimbawa. Ipapatupad namin ang tampok ng pagdaragdag ng todo post sa aming aplikasyon. Ipagpalagay natin na ang anumang post ay may natatanging id na magbibigay-daan sa amin na makilala ito sa ibang pagkakataon sa aming database, isang pamagat na isang string, at isang order na may uri ng integer. Kasunod ng aming diagram, magsisimula kami sa pamamagitan ng pagpapatupad ng router. Magdagdag ng sumusunod na code sa index.js file:

Starting a server in ExpressJS

Ito ang aming router file. Nag-i-import kami ng express at ang "addPost" na paraan mula sa aming controller (ipapatupad namin ang isang ito sa ilang sandali), lumikha ng isang instance ng express router, at itali ang paraan ng addPost sa aming router - ibig sabihin na para sa bawat kahilingan na mayroong root path at http paraan na "POST", ang "addPost" na paraan ay tatawagin upang mahawakan ito.

Bago namin ipatupad ang aming pamamaraan sa controller, tinutukoy namin ang bagong router sa aming pangunahing app.js file, at tinutukoy ang path nito bilang "/posts": Ang lahat ng mga ruta na may tinukoy na mga path ay ipapasa sa router na ito, upang ito ay mapangasiwaan sa pamamagitan ng iba't ibang mga pamamaraan ng controller:

Starting a server in ExpressJS

Ini-import namin ang router at pinangalanan ito bilang "mga post". app.use(“/posts”,..) ay nangangahulugan na ang lahat ng kahilingan na may subpath na “/posts”, anuman ang kanilang http method, ay iruruta sa tinukoy na router.

Kasama sa iba pang mga pagbabago sa app.js ang pag-import ng file ng configuration ng database upang maisakatuparan ito, at paggamit ng express.json() bilang middleware upang bigyang-daan kami na ma-access ang object ng request body.

Ngayong nakatakda na ang aming mga ruta, maaari naming idagdag ang paraan ng "addPost" sa controller.js file:

Starting a server in ExpressJS

Ang "addPost" ay isang middleware function na tumatagal bilang mga parameter sa kahilingan, mga object ng tugon, at ang susunod na function. Kapag tinawag ang susunod na function, lilipat ang proseso sa susunod na middleware sa chain, o tatapusin ang kahilingan. Sa code ng pamamaraan, kinukuha namin ang pamagat at ang pagkakasunud-sunod mula sa katawan ng kahilingan, at ipinapasa ang mga iyon bilang mga parameter sa function ng serbisyo na "createPost". Kinukuha ng function na ito ang mga katangian ng post, gumagawa ng bagong post, at ibinabalik ito. Kapag nalikha na ang bagong post, ibinabalik namin ito sa kliyente kasama ang 200 status code, ibig sabihin ay naging matagumpay ang kahilingan. Maaari mong mapansin na ang aming code ay inilalagay sa loob ng try/catch block upang mahuli ang anumang hindi inaasahang error, at ipasa ito sa susunod na middleware. Itinuturing na pinakamahusay na kasanayan na mag-attach sa lahat ng mga router ng middleware na nangangasiwa ng error na kumukuha ng error, at nagbabalik ng makabuluhang mensahe ng error sa kliyente.

Ang natitira na lang ngayon ay ipatupad ang function na "createPost" sa service.js:

nodejs_6

Tulad ng nabanggit namin kanina nang ipinapaliwanag ang iba't ibang mga layer ng arkitektura, nakikipag-ugnayan ang layer ng serbisyo sa solusyon sa pag-iimbak ng data sa pamamagitan ng paggamit ng ORM/ODM. Gayunpaman, sa aming halimbawa, hindi namin kakailanganing gumamit ng hiwalay na ORM, dahil ang Lowdb ay may kasamang built-in na suporta para sa Javascript. Ang lahat ng detalye tungkol sa syntax nito ay makikita sa dokumentasyon.

Ang "createPost" na paraan ay tumatanggap ng pamagat at pagkakasunud-sunod bilang mga parameter, at ginagamit ang mga ito upang lumikha ng post object. Para sa natatanging id, gumagamit kami ng nakalaang library na tinatawag na "nanoid", na bumubuo ng isang natatanging pagkakasunud-sunod ng mga character. Idinaragdag namin ang bagong post sa hanay ng mga post sa database, at isulat ang mga pagbabagong ito; ang bagong post ay ibabalik ng function.

Ngayong handa na ang "createPost", ang tampok na pagdaragdag ng mga post ay tapos na at gumagana na. Sinusubukan namin ito gamit ang Postman, isang sikat na tool para sa pagsubok ng mga API:

nodejs_7

Pinipili namin ang "POST" bilang paraan ng http para sa kahilingan kasama ang tinukoy na landas ng url na "localhost:3000/posts". Idinaragdag namin ang pamagat at ang pagkakasunud-sunod bilang json na format sa seksyon ng katawan, at ipinapadala ang kahilingan. Tulad ng ipinapakita sa itaas, natatanggap namin ang 200 OK na katayuan kasama ang bagong likhang post.

Konklusyon

Maraming mga konsepto at ideya ang na-explore sa proyektong ito: Sinaklaw namin kung paano i-install at i-set up ang kapaligiran ng aming proyekto, natutunan kung paano i-configure ang LowDB para sa pagtitiyaga ng lokal na data, ginalugad ang pangkalahatang arkitektura ng NodeJS/Express backend application, at nakita kung paano ilapat ito sa isang simpleng halimbawa. Sa wakas, sinubukan namin ang aming aplikasyon gamit ang Postman.

Ang layunin dito ay upang ilantad ang isang pinasimple na bersyon ng lahat ng napupunta sa pagbuo ng mga modernong backend na application. Gaya ng nakita natin kanina, ang NodeJs ay isang makapangyarihang tool na nagbibigay-daan sa amin na bumuo ng simple at kumplikadong mga API. Kasama ang mayamang ecosystem ng mga frameworks, gaya ng express at napakaraming tool at library para sa halos anumang kaso ng paggamit, ito ay isang legit na solusyon para sa modernong backend development - isang solusyon na inirerekomenda naming matutunan at makabisado.


Career Services background pattern

Mga Serbisyo sa Karera

Contact Section background image

Manatiling nakikipag-ugnayan tayo

Code Labs Academy © 2024 Lahat ng karapatan ay nakalaan.