Introdución a NodeJs

nodejs
javascript
servidor
Introdución a NodeJs cover image

Introdución

Cando intentas aprender sobre a web

desenvolvemento, normalmente atopamos que o front-end é significativamente máis accesible que o back-end. Hai moitas razóns para iso, especialmente a sensación de retroalimentación instantánea que se produce ao cambiar un determinado elemento dunha páxina no código e notar o cambio que se aplica ao sitio web. Este feedback adoita ser útil para os principiantes, porque lles permite axustar o seu código e aprender dos seus erros. Desafortunadamente, non é o caso do backend: moitas veces, dedícase unha cantidade importante de traballo a configurar o ambiente por adiantado e instalar as dependencias necesarias para que apareza unha sinxela mensaxe "Ola mundo" no terminal., constantemente está a facerse moito na comunidade de código aberto para facilitar o proceso de desenvolvemento de frameworks, e mellorar a experiencia do programador é un bo exemplo diso código en Javascript conveniente, e ofrece unha variedade de ferramentas e funcións integradas que o diferencian dos seus competidores. Neste artigo, exploraremos NodeJs e o seu ecosistema, cun enfoque práctico, creando un proxecto totalmente funcional.

Que imos construír?

As aplicacións ToDo son un proxecto para principiantes que aprenden o desenvolvemento front-end. É por iso que decidimos crear unha API de lista de tarefas. Isto permitiranos engadir a persistencia de datos á nosa interface e darnos a posibilidade de manipular estes datos (engadindo, actualizando, eliminando todos, etc...).

O código final pódese atopar aquí.

As nosas ferramentas

Usaremos unha pila de tecnoloxía simplificada para este proxecto. Pódese considerar como unha versión mínima de moitas ferramentas que atoparás en proxectos da vida real, a razón de que as ideas de nivel superior son as mesmas. Os detalles de implementación e elección dunha ferramenta específica sobre outra non son importantes para comezar.

  • NodeJs, como mencionamos, é un dos frameworks Javascript máis populares para crear aplicacións no servidor.

  • ExpressJs é un marco Javascript mínimo usado enriba de NodeJS. Acelera o proceso de desenvolvemento usando moitas funcións integradas. Tamén se usa como unha forma de estandarizar as prácticas de desenvolvemento en proxectos de NodeJS para facilitar o seu uso aos enxeñeiros.

  • LowDB é unha simple base de datos en memoria. A súa sinxeleza permítenos mostrar como interactuar cunha base de datos nun proxecto NodeJs, sen tratar temas máis avanzados como despregamentos e configuracións.

Agora que identificamos todas as ferramentas que usaremos, imos aos nosos teclados e empecemos a codificar!

Instalación

Node está dispoñible en todas as plataformas. Todas as guías de instalación pódense atopar no sitio web oficial. Os usuarios de Windows deben asegurarse de engadir o nodo ruta ás variables de ambiente para que se poida usar na liña de comandos.

Tamén necesitaremos npm instalado. Npm é o xestor de paquetes estándar para NodeJs. Permitiranos xestionar as dependencias do noso proxecto. A guía de instalación pódese atopar aquí.

Inicialización do proxecto

Diríxete á ligazón e clona o proxecto de inicio:

Este é un simple repositorio de inicio para o noso proxecto. Contén todas as dependencias que utilizaremos xunto coa estrutura do ficheiro do proxecto. Explicaremos cada elemento unha vez alcanzado. Abra o seu terminal, navegue ata a ruta do proxecto e execute o comando:

npm install

Isto instalará todas as dependencias do proxecto especificadas no ficheiro package.json. package.json é o ficheiro que se atopa na raíz de calquera proxecto Javascript/NodeJs, contén metadatos sobre este último e úsase para xestionar todas as dependencias, scripts e versións do proxecto.

Despois de instalar todas as dependencias, podemos iniciar a nosa aplicación:

npm run start

"start" é un script que especificamos no paquete. ficheiro json. Especifica o ficheiro de entrada á nosa aplicación, que no noso caso é app.js.

A seguinte mensaxe debería aparecer agora no teu terminal:

nodejs_1

Isto significa que o noso servidor comezou correctamente e está a escoitar as solicitudes enviadas ao porto 3000. Vexamos app.js e expliquemos o que está a suceder aquí:

nodejs_2

App.js é o noso ficheiro de entrada do proxecto (e o único neste momento). Creamos unha instancia dunha aplicación expresa chamada app, especificamos que todas as solicitudes que teñan o método http "GET" e a subruta '/' serán xestionadas por esta ruta, pasamos unha función chamada middleware, que toma o obxecto de solicitude e resposta como parámetros. Isto é fundamental, xa que a solicitude contén toda a información necesaria para a súa xestión (parámetros, corpo da solicitude, cabeceiras da solicitude, etc.), e o obxecto de resposta é o que se devolverá ao cliente. Comezamos por enviar a mensaxe "Ola mundo". Despois diso, facemos que a nosa aplicación escoite as solicitudes entrantes no porto especificado (no noso caso 3000) e rexistremos a mensaxe "Escoitando o porto 3000" para indicar que a nosa aplicación está en funcionamento e lista para recibir solicitudes.

Abra o seu terminal e na barra de ligazóns escriba "localhost:3000/" e prema Intro. Este é o camiño especificado que podemos usar para chegar ao noso servidor localmente. Recibirás a seguinte mensaxe:

nodejs_3

Configuración da base de datos

Lowdb é unha base de datos de código aberto que é fácil de usar e non require ningunha configuración específica. A idea xeral detrás é almacenar todos os datos nun ficheiro json local. Despois de instalar LowDB (o que se fixo cando instalamos todas as dependencias), podemos engadir o seguinte código a db.js:

nodejs_4

Este código é bastante similar ao que se atopa na documentación oficial de LowDB. Axustámolo un pouco para o noso propio caso de uso. Explicámolo liña por liña:

As primeiras liñas son para importar as dependencias necesarias. "join" é unha función de utilidade dispoñible no módulo "path". É un dos módulos fundamentais de NodeJs que ofrece moitos métodos para tratar e manexar camiños. "Low" e "JSONFile" son as dúas clases expostas por LowDB. O primeiro crea a instancia do ficheiro json que conterá os nosos datos. O segundo crea a instancia de base de datos real que actuará sobre ela. Finalmente, "lodash" é unha das bibliotecas javascript máis utilizadas que ofrece unha gran variedade de funcións de utilidade para tarefas comúns de programación. Engadímolo á nosa instancia de base de datos para permitirnos utilizar os seus métodos avanzados para xestionar os nosos datos.

En primeiro lugar, especificamos a ruta do ficheiro db.json. É o ficheiro que conterá os nosos datos e pasará a LowDB. Se o ficheiro non se atopa na ruta especificada, LowDB creará un.

Despois pasamos o camiño do ficheiro ao adaptador LowDB e pasámolo á nosa nova instancia de base de datos LowDB. A variable "db" pódese usar entón para comunicarse coa nosa base de datos. Unha vez creada a instancia da base de datos, lemos desde o ficheiro json usando db.read(). Isto establecerá o campo "datos" na nosa instancia de base de datos para que poidamos acceder ao contido da base de datos. Teña en conta que precedemos esta liña con "esperar". Isto é para especificar que esta instrución pode tardar un tempo descoñecido en resolverse e que o proceso NodeJs debe esperar a súa execución antes de continuar co resto do código. Facemos isto porque a operación de lectura require acceso á memoria ao ficheiro especificado e o tempo para executar este tipo de operación depende das especificacións da túa máquina.

Agora que temos acceso ao campo de datos, establecémolo como un obxecto que contén unha matriz baleira de publicacións, ou mellor dito, comprobamos se o ficheiro contén datos anteriores e establecemos a matriz baleira se non é o caso.

Finalmente, executamos db.write() para aplicar as modificacións que fixemos aos datos, e exportamos a instancia da base de datos para que poida ser usada noutros ficheiros do noso proxecto.

Fluxo de traballo de solicitude/resposta xeral

Considere o seguinte diagrama:

nodejs_5

Mostra a arquitectura xeral aplicada nunha infinidade de aplicacións de backend construídas con NodeJs/Express. Comprender o fluxo de traballo xeral detrás do manexo dunha solicitude non só che permitirá construír e estruturar aplicacións de NodeJs, senón que tamén che permitirá transferir estes conceptos a practicamente calquera pila técnica que elixas. Exploraremos as diferentes capas que interfiren neste proceso e explicaremos as súas funcións:

## Capa de solicitude HTTP

Esta é a primeira capa da nosa aplicación, imaxínao como unha pasarela que recibe un amplo abano de solicitudes diferentes procedentes de diferentes clientes, despois cada solicitude é analizada e remitida á parte dedicada da aplicación para que sexa xestionada.

  • Routers: aquí estamos a referirnos aos routers Express, pero este concepto pódese atopar en moitos frameworks de backend. Os enrutadores son unha forma de aplicar a distribución lóxica da nosa lóxica empresarial ao noso código, o que significa que cada conxunto de elementos que comparten características similares son xestionados pola mesma entrada e poden separarse do resto dos conxuntos. Isto ten a vantaxe de que cada compoñente do código sexa independente dos outros, e sexa máis fácil de manter e estender. Máis concretamente, e como exemplo, todas as solicitudes que cumpran as condicións da ruta URL compartida "/posts" serán xestionadas polo mesmo enrutador. Dependendo do seu método http (GET, POST, etc.), empregarase un controlador diferente.

  • Controladores: un controlador recibe solicitudes filtradas dos enrutadores, aplica un procesamento adicional e chama aos métodos de servizo axeitados.

Capa de lóxica empresarial

Esta capa é única dependendo dos casos de uso específicos da aplicación e da lóxica de negocio detrás dela.

  • Servizos: os servizos son un conxunto de métodos que conteñen a lóxica central da aplicación. Tamén interactúan coa base de datos mediante o uso de ORMs/ODMs.

  • Servizos de terceiros: moitas aplicacións modernas optan por delegar unha parte da lóxica da aplicación en servizos dedicados accesibles a través dunha API. Os servizos deste tipo poden ser servizos de xestión de pagos, almacenamento de ficheiros estáticos, notificacións e outros.

  • ODM/ORM: os ORM e os ODM actúan como intermediarios entre os servizos e a base de datos. O seu papel é proporcionar unha abstracción de alto nivel sobre unha base de datos que permita a un programador escribir código na linguaxe de programación da súa elección en lugar de linguaxes de base de datos dedicadas, como SQL.

Capa de persistencia de datos

  • Bases de datos: como mencionamos anteriormente, case todas as aplicacións necesitan algún tipo de persistencia de datos. Esta parte é xestionada por bases de datos e, dependendo da natureza dos datos, a lóxica empresarial e moitas outras consideracións, a elección dunha determinada base de datos sobre outra considérase crucial para a eficiencia e a escalabilidade da aplicación.

Exemplo: Engadir unha publicación

Agora que entendemos a idea xeral detrás da arquitectura, aplicámola ao noso exemplo sinxelo. Implementaremos a función de engadir unha publicación de todo á nosa aplicación. Supoñamos que calquera publicación ten un ID único que nos permitirá identificalo máis tarde na nosa base de datos, un título que é unha cadea e unha orde de tipo enteiro. Seguindo o noso diagrama, comezaremos por implementar o router. Engade o seguinte código ao ficheiro index.js:

Starting a server in ExpressJS

Este é o noso ficheiro de enrutador. Importamos o método express e "addPost" do noso controlador (implementaremos este en breve), creamos unha instancia de enrutador expreso e vinculamos o método addPost ao noso enrutador, o que significa que para cada solicitude que teña a ruta raíz e o http método "POST", chamarase ao método "addPost" para manexalo.

Antes de implementar o noso método no controlador, facemos referencia ao novo enrutador no noso ficheiro principal app.js e especificamos a súa ruta como "/posts": todas as rutas coas rutas especificadas serán reenviadas a este enrutador, polo que se pode manexar. polos diferentes métodos de controlador:

Starting a server in ExpressJS

Importamos o router e o nomeamos como "publicacións". app.use ("/posts",..) significa que todas as solicitudes coa subruta "/posts", sen importar o seu método http, serán encamiñadas ao enrutador especificado.

Outros cambios no app.js inclúen a importación do ficheiro de configuración da base de datos para que se execute e o uso de express.json() como middleware para permitirnos acceder ao obxecto do corpo da solicitude.

Agora que as nosas rutas están configuradas, podemos engadir o método "addPost" no ficheiro controller.js:

Starting a server in ExpressJS

“addPost” é unha función de middleware que toma como parámetros a solicitude, os obxectos de resposta e a seguinte función. Cando se chame á seguinte función, o proceso pasará ao seguinte middleware da cadea ou finalizará a solicitude. No código do método, extraemos o título e a orde do corpo da solicitude e pasámolos como parámetros á función de servizo "createPost". Esta función toma os atributos da publicación, crea unha nova publicación e devólvela. Unha vez creada a nova publicación, devolvémola ao cliente xunto co código de estado 200, o que significa que a solicitude foi exitosa. Podes notar que o noso código ponse dentro dun bloque try/catch para detectar calquera erro inesperado e pasalo ao seguinte middleware. Considérase a mellor práctica anexar a todos os enrutadores un middleware de manexo de erros que extrae o erro e devolva unha mensaxe de erro significativa ao cliente.

Todo o que queda agora é implementar a función "createPost" en service.js:

nodejs_6

Como mencionamos anteriormente ao explicar as diferentes capas da arquitectura, a capa de servizo interactúa coa solución de almacenamento de datos mediante o uso de ORM/ODM. Non obstante, no noso exemplo, non necesitaremos usar un ORM separado, xa que Lowdb inclúe soporte integrado para Javascript. Todos os detalles sobre a súa sintaxe pódense atopar na documentación.

O método "createPost" recibe título e orde como parámetros e utilízaos para crear o obxecto de publicación. Para o identificador único, usamos unha biblioteca dedicada chamada "nanoide", que xera unha secuencia única de caracteres. Engadimos a nova publicación á matriz de publicacións da base de datos e escribimos estes cambios; a nova publicación é entón devolta pola función.

Agora que "createPost" está listo, a función de engadir publicacións xa está rematada e funcionando. Probámolo usando Postman, unha ferramenta popular para probar as API:

nodejs_7

Seleccionamos "POST" como método http para a solicitude xunto coa ruta URL especificada "localhost:3000/posts". Engadimos o título e a orde como formato json na sección do corpo e enviamos a solicitude. Como se mostra arriba, recibimos o estado 200 OK xunto coa publicación recentemente creada.

Conclusión

Neste proxecto exploráronse moitos conceptos e ideas: cubrimos como instalar e configurar o noso entorno de proxecto, aprendemos a configurar LowDB para a persistencia de datos locais, exploramos a arquitectura xeral das aplicacións de backend NodeJS/Express e vimos como aplicalo nun exemplo sinxelo. Finalmente, probamos a nosa aplicación usando Postman.

A intención aquí era expor unha versión simplificada de todo o que se necesita para crear aplicacións de backend modernas. Como vimos anteriormente, NodeJs é unha poderosa ferramenta que nos permite crear API simples e complexas. Combinado co seu rico ecosistema de marcos, como Express e unha infinidade de ferramentas e bibliotecas para case calquera caso de uso, é unha solución lexítima para o desenvolvemento de backend moderno, unha solución que recomendamos aprender e dominar.


Listo para mellorar as habilidades? Únete ao Code Labs Academy de Code Labs Academy (campamento de arranque de desenvolvemento web completo](/courses/web-development) e mantéñase á fronte en tecnoloxía.


Career Services background pattern

Servizos de Carreira

Contact Section background image

Mantémonos en contacto

Code Labs Academy © 2024 Todos os dereitos reservados.