Introducció a NodeJs

nodejs
javascript
servidor
Introducció a NodeJs cover image

Introducció

Quan intenteu aprendre sobre la web

desenvolupament, normalment trobem que el front-end és significativament més accessible que el back-end. Hi ha moltes raons per això, especialment la sensació de retroalimentació instantània que prové de canviar un determinat element d'una pàgina del codi i notar el canvi que s'aplica al lloc web. Aquest comentari sovint és útil per als principiants, perquè els permet ajustar el codi i aprendre dels seus errors. Malauradament, no és el cas del backend: sovint, es dedica una quantitat important de treball a configurar l'entorn per endavant i instal·lar les dependències necessàries per tal que aparegui un missatge senzill "Hola món" al terminal., s'està avançant constantment a la comunitat de codi obert per facilitar el procés de desenvolupament de frameworks, i la millora de l'experiència del desenvolupador és un bon exemple d'això codi en Javascript convenient i ofereix una varietat d'eines i funcions integrades que el diferencien dels seus competidors. En aquest article, explorarem NodeJs i el seu ecosistema, amb un enfocament pràctic, construint un projecte totalment funcional.

Què construirem?

Les aplicacions ToDo són un projecte bàsic per als principiants que aprenen el desenvolupament frontal. És per això que vam decidir crear una API de llista de tasques. Això ens permetrà afegir persistència de dades a la nostra interfície i ens donarà la possibilitat de manipular aquestes dades (afegint, actualitzant, eliminant tots, etc.).

El codi final es pot trobar aquí.

Les nostres eines

Utilitzarem una pila de tecnologia simplificada per a aquest projecte. Es pot considerar com una versió mínima de moltes eines que trobareu en projectes de la vida real, perquè les idees de nivell superior són les mateixes. Els detalls de la implementació i l'elecció d'una eina específica sobre una altra no són importants per començar.

  • NodeJs, com hem esmentat, és un dels frameworks Javascript més populars per crear aplicacions del costat del servidor.

  • ExpressJs és un marc Javascript mínim utilitzat a la part superior de NodeJS. Accelera el procés de desenvolupament utilitzant moltes funcions integrades. També s'utilitza com a forma d'estandarditzar les pràctiques de desenvolupament en projectes NodeJS per tal de facilitar-ne l'ús per als enginyers.

  • LowDB és una simple base de dades en memòria. La seva senzillesa ens permet mostrar com interactuar amb una base de dades en un projecte NodeJs, sense tractar temes més avançats com els desplegaments i les configuracions.

Ara que hem identificat totes les eines que farem servir, anem als nostres teclats i comencem a codificar!

Instal·lació

Node està disponible a totes les plataformes. Totes les guies d'instal·lació es poden trobar al lloc web oficial. Els usuaris de Windows haurien d'assegurar-se d'afegir el node camí a les variables d'entorn perquè es pugui utilitzar a la línia d'ordres.

També necessitarem npm instal·lat. Npm és el gestor de paquets estàndard per a NodeJs. Ens permetrà gestionar les dependències del nostre projecte. La guia d'instal·lació es pot trobar aquí.

Inicialització del projecte

Aneu a l'enllaç i cloneu el projecte inicial:

Aquest és un repositori d'inici senzill per al nostre projecte. Conté totes les dependències que utilitzarem juntament amb l'estructura del fitxer del projecte. Explicarem cada element un cop assolit. Obriu el vostre terminal, navegueu a la ruta del projecte i executeu l'ordre:

npm install

Això instal·larà totes les dependències del projecte especificades al fitxer package.json. package.json és el fitxer que es troba a l'arrel de qualsevol projecte Javascript/NodeJs, conté metadades sobre aquest últim i s'utilitza per gestionar totes les dependències, scripts i versions del projecte.

Després d'instal·lar totes les dependències, podem iniciar la nostra aplicació:

npm run start

"start" és un script que hem especificat al paquet. fitxer json. Especifica el fitxer d'entrada a la nostra aplicació, que en el nostre cas és app.js.

Ara hauria d'aparèixer el missatge següent al vostre terminal:

nodejs_1

Això vol dir que el nostre servidor s'ha iniciat correctament i està escoltant les sol·licituds enviades al port 3000. Mirem app.js i expliquem què està passant aquí:

nodejs_2

App.js és el nostre fitxer d'entrada del projecte (i l'únic en aquest moment). Instanciem una aplicació express anomenada app, especifiquem que totes les sol·licituds que tenen el mètode http "GET" i el subcamí "/" seran gestionades per aquesta ruta, passem una funció anomenada middleware, que pren l'objecte de sol·licitud i resposta com a paràmetres. Això és crucial, ja que la sol·licitud conté tota la informació necessària per poder-la gestionar (paràmetres, cos de la petició, capçaleres de la sol·licitud, etc.), i l'objecte de resposta és el que es retornarà al client. Comencem només enviar el missatge "Hola món". Després d'això, fem que la nostra aplicació escolti les sol·licituds entrants al port especificat (en el nostre cas 3000) i registrem el missatge "Escoltant el port 3000" per indicar que la nostra aplicació està en funcionament i preparada per rebre sol·licituds.

Obriu el vostre terminal i, a la barra d'enllaços, escriviu "localhost:3000/" i premeu Enter. Aquesta és la ruta especificada que podem utilitzar per arribar al nostre servidor localment. Rebràs el missatge següent:

nodejs_3

Configuració de la base de dades

Lowdb és una base de dades de codi obert que és fàcil d'utilitzar i no requereix cap configuració específica. La idea general que hi ha darrere és emmagatzemar totes les dades en un fitxer JSON local. Un cop instal·lat LowDB (cosa que s'ha fet quan vam instal·lar totes les dependències), podem afegir el codi següent a db.js:

nodejs_4

Aquest codi és força similar al que es troba a la documentació oficial de LowDB. Ho vam ajustar una mica per al nostre propi cas d'ús. Ho expliquem línia per línia:

Les primeres línies són per importar les dependències necessàries. "join" és una funció d'utilitat disponible al mòdul "path". És un dels mòduls bàsics de NodeJs que ofereix molts mètodes per tractar i gestionar camins. "Low" i "JSONFile" són les dues classes exposades per LowDB. El primer crea la instància del fitxer json que contindrà les nostres dades. El segon crea la instància de base de dades real que actuarà sobre ella. Finalment, "lodash" és una de les biblioteques javascript més utilitzades que ofereix una gran varietat de funcions d'utilitat per a tasques de programació habituals. L'afegim a la nostra instància de base de dades per permetre'ns utilitzar els seus mètodes avançats per gestionar les nostres dades.

Primer, especifiquem la ruta del fitxer db.json. És el fitxer que contindrà les nostres dades i es passarà a LowDB. Si el fitxer no es troba al camí especificat, LowDB en crearà un.

A continuació, passem la ruta del fitxer a l'adaptador LowDB i el passem a la nostra nova instància de base de dades LowDB. La variable "db" es pot utilitzar per comunicar-se amb la nostra base de dades. Un cop creada la instància de la base de dades, llegim del fitxer json mitjançant db.read(). Això establirà el camp "dades" a la nostra instància de base de dades perquè puguem accedir al contingut de la base de dades. Observeu que hem precedit aquesta línia amb "espera". Això és per especificar que aquesta instrucció pot trigar un temps desconegut a resoldre's i que el procés de NodeJs ha d'esperar la seva execució abans de continuar amb la resta del codi. Ho fem perquè l'operació de lectura requereix accés de memòria al fitxer especificat i el temps per executar aquest tipus d'operacions depèn de les especificacions de la vostra màquina.

Ara que tenim accés al camp de dades, el configurem com un objecte que conté una matriu buida de publicacions, o millor dit, comprovem si el fitxer conté dades anteriors i establim la matriu buida si no és el cas.

Finalment, executem db.write() per aplicar les modificacions que hem fet a les dades, i exportem la instància de la base de dades perquè es pugui utilitzar en altres fitxers del nostre projecte.

Flux de treball de sol·licitud/resposta general

Considereu el diagrama següent:

nodejs_5

Mostra l'arquitectura general aplicada en una gran quantitat d'aplicacions de fons construïdes amb NodeJs/Express. Entendre el flux de treball general darrere de la gestió d'una sol·licitud no només us permetrà crear i estructurar aplicacions de NodeJ, sinó que també us permetrà transferir aquests conceptes a pràcticament qualsevol pila tècnica que trieu. Explorarem les diferents capes que interfereixen en aquest procés i explicarem les seves funcions:

## Capa de sol·licitud HTTP

Aquesta és la primera capa de la nostra aplicació, imagineu-la com una passarel·la que rep un ampli ventall de sol·licituds diferents procedents de diferents clients, després cada sol·licitud s'analitza i s'envia a la part dedicada de l'aplicació perquè sigui gestionada.

  • Encaminadors: aquí ens referim als encaminadors Express, però aquest concepte es pot trobar en molts frameworks backend. Els encaminadors són una manera d'aplicar la distribució lògica de la nostra lògica de negoci al nostre codi, és a dir, cada conjunt d'elements que comparteixen característiques similars es gestiona per la mateixa entrada i es pot separar de la resta de conjunts. Això té l'avantatge de fer que cada component del codi sigui independent dels altres, i més fàcil de mantenir i ampliar. Més concretament, i com a exemple, totes les sol·licituds que compleixin les condicions de la ruta d'URL compartida "/posts" seran gestionades pel mateix encaminador. Depenent del seu mètode http (GET, POST, etc.), s'utilitzarà un controlador diferent.

  • Controladors: un controlador rep peticions filtrades dels encaminadors, aplica un processament addicional i crida als mètodes de servei adequats.

Capa de lògica empresarial

Aquesta capa és única segons els casos d'ús específics de l'aplicació i la lògica empresarial que hi ha darrere.

  • Serveis: els serveis són un conjunt de mètodes que contenen la lògica bàsica de l'aplicació. També interactuen amb la base de dades mitjançant l'ús de ORMs/ODMs.

  • Serveis de tercers: moltes aplicacions modernes opten per delegar una part de la lògica de l'aplicació en serveis dedicats accessibles mitjançant una API. Aquests serveis poden ser serveis de gestió de pagaments, emmagatzematge de fitxers estàtics, notificacions i altres.

  • ODM/ORM: els ORM i els ODM actuen com a intermediaris entre els serveis i la base de dades. El seu paper és proporcionar una abstracció d'alt nivell sobre una base de dades que permeti a un desenvolupador escriure codi en el llenguatge de programació que triï en comptes de llenguatges de base de dades dedicats, com ara SQL.

Capa de persistència de dades

  • Bases de dades: com hem esmentat anteriorment, gairebé totes les aplicacions necessiten algun tipus de persistència de dades. Aquesta part és gestionada per bases de dades i, depenent de la naturalesa de les dades, la lògica de negoci i moltes altres consideracions, l'elecció d'una determinada base de dades sobre una altra es considera crucial per a l'eficiència i l'escalabilitat de l'aplicació.

Exemple: afegir una publicació

Ara que entenem la idea general darrere de l'arquitectura, apliquem-la al nostre exemple senzill. Implementarem la funció d'afegir una publicació de tot a la nostra aplicació. Suposem que qualsevol publicació té un identificador únic que ens permetrà identificar-lo més endavant a la nostra base de dades, un títol que és una cadena i un ordre que és de tipus enter. Seguint el nostre diagrama, començarem implementant el router. Afegiu el codi següent al fitxer index.js:

Starting a server in ExpressJS

Aquest és el nostre fitxer d'encaminador. Importem express i el mètode "addPost" des del nostre controlador (implementarem aquest en breu), creem una instància d'encaminador express i enllacem el mètode addPost al nostre encaminador, és a dir, per a cada sol·licitud que tingui el camí arrel i el http mètode "POST", es cridarà el mètode "addPost" per gestionar-lo.

Abans d'implementar el nostre mètode al controlador, fem referència al nou encaminador al nostre fitxer principal app.js i especifiquem el seu camí com a "/posts": totes les rutes amb els camins especificats s'enviaran a aquest encaminador, de manera que es pugui gestionar. pels diferents mètodes de control:

Starting a server in ExpressJS

Importem l'encaminador i l'anomenem com a "publicacions". app.use(“/posts”,..) significa que totes les sol·licituds amb el subruta “/posts”, independentment del seu mètode http, s'enviaran a l'encaminador especificat.

Altres canvis a app.js inclouen la importació del fitxer de configuració de la base de dades per tal que s'executi i l'ús de express.json() com a programari intermediari per permetre'ns accedir a l'objecte del cos de la sol·licitud.

Ara que les nostres rutes estan configurades, podem afegir el mètode "addPost" al fitxer controller.js:

Starting a server in ExpressJS

"addPost" és una funció de middleware que pren com a paràmetres la sol·licitud, els objectes de resposta i la funció següent. Quan es crida la següent funció, el procés passarà al següent middleware de la cadena o finalitzarà la sol·licitud. Al codi del mètode, extreu el títol i l'ordre del cos de la sol·licitud i els passem com a paràmetres a la funció de servei "createPost". Aquesta funció pren els atributs de la publicació, crea una publicació nova i la retorna. Un cop creada la nova publicació, la retornem al client juntament amb el codi d'estat 200, el que significa que la sol·licitud ha estat satisfactòria. És possible que observeu que el nostre codi es posa dins d'un bloc try/catch per detectar qualsevol error inesperat i passar-lo al següent middleware. Es considera la millor pràctica adjuntar a tots els encaminadors un programari intermedi de gestió d'errors que extreu l'error i retorni un missatge d'error significatiu al client.

Tot el que queda ara és implementar la funció "createPost" a service.js:

nodejs_6

Com hem esmentat anteriorment en explicar les diferents capes de l'arquitectura, la capa de servei interactua amb la solució d'emmagatzematge de dades mitjançant l'ús d'ORM/ODM. Tanmateix, en el nostre exemple, no haurem d'utilitzar un ORM independent, ja que Lowdb inclou suport integrat per a Javascript. Tots els detalls sobre la seva sintaxi es poden trobar a la documentació.

El mètode "createPost" rep el títol i l'ordre com a paràmetres i els utilitza per crear l'objecte de publicació. Per a l'identificador únic, utilitzem una biblioteca dedicada anomenada "nanoide", que genera una seqüència única de caràcters. Afegim la nova publicació a la matriu de publicacions de la base de dades i escrivim aquests canvis; aleshores la funció retorna la publicació nova.

Ara que "createPost" està llest, la funció d'afegir publicacions s'ha acabat i està en funcionament. Ho provem amb Postman, una eina popular per provar API:

nodejs_7

Seleccionem "POST" com a mètode http per a la sol·licitud juntament amb el camí d'URL especificat "localhost:3000/posts". Afegim el títol i l'ordre com a format json a la secció del cos i enviem la sol·licitud. Com es mostra més amunt, rebem l'estat 200 OK juntament amb la publicació acabada de crear.

Conclusió

En aquest projecte s'han explorat molts conceptes i idees: vam tractar com instal·lar i configurar el nostre entorn de projecte, vam aprendre a configurar LowDB per a la persistència de les dades locals, vam explorar l'arquitectura general de les aplicacions de fons NodeJS/Express i vam veure com aplicar-ho en un exemple senzill. Finalment, vam provar la nostra aplicació amb Postman.

La intenció aquí era exposar una versió simplificada de tot el que passa per crear aplicacions de backend modernes. Com hem vist anteriorment, NodeJs és una eina potent que ens permet crear API simples i complexes. Combinat amb el seu ric ecosistema de marcs, com ara express i una gran quantitat d'eines i biblioteques per a gairebé qualsevol cas d'ús, és una solució legítima per al desenvolupament de backend modern, una solució que recomanem aprendre i dominar.


Career Services background pattern

Serveis de carrera

Contact Section background image

Seguim en contacte

Code Labs Academy © 2024 Tots els drets reservats.