Descobreix Nest.js, el Framework de desenvolupament de Backend per a Frontend

Qué-es-cómo-funciona-Nest.js-Framework-desarrollo-Backend-Frontend-Itequia

Descobreix Nest.js, el Framework de desenvolupament de Backend per a Frontend

Gestionar una aplicació a gran escala pot ser tediós, especialment quan es construeix sense una estructura ben planificada i una estricta estratègia d’organització del codi. Això pot provocar un desastre durant el manteniment de l’aplicació i s’ha d’evitar costi el que costi. Normalment aquests desastres es deuen als canvis realitzats al codi base i a les noves característiques a mesura que el projecte creix a la base d’usuaris. Per intentar evitar aquests problemes, va néixer Nest.js, que es va construir per oferir solucions als problemes d’estructura i estratègia d’organització del codi.

Què és Nest.js?

Nest.js és un framework de desenvolupament web basat en Node.js que utilitza TypeScript per proporcionar una estructura de programació sòlida i altament escalable.

que-es-nestjs-Itequia

S’inspira en altres frameworks de desenvolupament populars, com Angular i Spring, i se centra en la creació d’aplicacions de Backend altament escalables i modulars, encara que també pots desenvolupar aplicacions web.

És compatible i inclou integracions per defecte amb una àmplia varietat de bases de dades i sistemes d’autenticació, i es pot utilitzar amb una àmplia varietat de mòduls de tercers per afegir-hi funcionalitats addicionals. A més, s’integra amb eines de testing i depuració per ajudar a testar i depurar el codi de l’aplicació.

Elements bàsics de l’arquitectura de l’aplicació

Nest.js és un framework de desenvolupament web que mimetitza l’arquitectura d’Angular en gran mesura. Encara que no utilitzeu llibreries d’Angular guarda moltes similituds d’arquitectura el que redueix enormement la corba d’aprenentatge per a un desenvolupador d’Angular.

Si ets desenvolupador Frontend de qualsevol altre framework segueix sent la teva opció davant de frameworks Backend tradicionals.

Nest.js té un enfocament basat en components, el que significa que l’aplicació es divideix en mòduls que contenen components, controladors i serveis relacionats. Això fa que sigui més fàcil organitzar i mantenir el codi de l’aplicació.

Està basat en TypeScript, la qual cosa significa que podeu utilitzar totes les característiques de TypeScript en el vostre codi com tipus estàtics, classes, herències, llegibilitat, interfícies, decoradors, etc.

Vegem a continuació els elements de l’arquitectura de l’aplicació més destacats:

Mòduls

A Nest.js, cada aplicació està dividida en mòduls, que són conjunts de components, controladors i serveis relacionats que treballen junts per realitzar una tasca específica.

Podeu conèixer més detalls aquí.

Controladors

Els controladors són classes que manegen les sol·licituds HTTP i tornen una resposta. Els controladors s’assignen a rutes específiques, cosa que significa que només manejaran les sol·licituds que coincideixin amb aquesta ruta.

Podeu conèixer més detalls aquí.

Serveis

Els serveis són classes que contenen lògica de negoci i poden ser injectades en controladors o altres classes de servei. Els serveis s’utilitzen sovint per interactuar amb bases de dades o realitzar altres tasques que no són específiques de la lògica de presentació.

Podeu conèixer més detalls aquí.

Pipes

Els pipes són classes que es poden fer servir per transformar o validar les dades que entren o surten d’una aplicació. Els pipes es poden aplicar als arguments dels mètodes de controlador o als valors dels camps d’entrada i sortida duna sol·licitud o resposta HTTP.

Podeu conèixer més detalls aquí.

Guards

Són components que es fan servir per protegir les rutes d’accés no autoritzat. Els Guards es poden utilitzar per verificar si un usuari té permisos per accedir a una ruta determinada i per prendre mesures adequades si no és així.

Podeu conèixer més detalls aquí.

Middleware

El middleware és codi que s’executa entre l’arribada d’una sol·licitud i l’execució del controlador corresponent. Es pot utilitzar per fer tasques com l’autenticació o la validació de dades abans que arribin al controlador.

Podeu conèixer més detalls aquí.

Decoradors

Els decoradors són funcions que s’apliquen a classes, mètodes o propietats i en modifiquen el comportament. Nest.js inclou diversos decoradors predefinits que es poden utilitzar per fer tasques com l’assignació de rutes a controladors o la injecció de dependències.

Podeu conèixer més detalls aquí.

A més d’aquests elements bàsics esmentats, Nest.js es pot fer servir amb una àmplia varietat de mòduls de tercers que proporcionen funcionalitats addicionals. Aquests mòduls poden incloure coses com bases de dades, sistemes d’autenticació i eines de testing.

Quines són les principals funcionalitats de Nest.js?

Vegem a continuació les principals característiques de Nest.js:

Flexible

Es pot utilitzar tant per a aplicacions web com de back-end. encara que és més popular com aplicació de back-end.

Escalable i modulable

Principales-funcionalidades-Nest.js-Itequia

Dissenyat per ser altament escalable i modulable, el que significa que es pot utilitzar per crear aplicacions de grans dimensions i complexitat sense sacrificar la facilitat d’ús i el manteniment.

Integració amb bases de dades i sistemes d’autenticació

Compatible amb una àmplia varietat de bases de dades i sistemes d’autenticació, cosa que significa que podeu utilitzar Nest.js per crear aplicacions que es connectin a bases de dades o que utilitzin mecanismes d’autenticació com OAuth.

Compatible amb microserveis

Nest.js es pot utilitzar per crear aplicacions basades en microserveis, cosa que significa que podeu dividir l’aplicació en components més petits que es poden desplegar i escalar de forma independent.

Integració amb sistemes de missatgeria

Es pot integrar amb sistemes de missatgeria com RabbitMQ i Kafka, cosa que permet a les aplicacions comunicar-se entre si de forma asíncrona.

Esquema de rutes

Utilitza un esquema de rutes per assignar controladors a rutes específiques, cosa que significa que només manejaran les sol·licituds que coincideixin amb aquesta ruta.

Integració amb eines de testing

S’integra amb eines de testing com Jest i Mocha, cosa que facilita la realització de proves unitàries, integració i acceptació.

Integració amb eines d’anàlisi de rendiment

S’integra amb eines com New Relic i Application Insights, cosa que permet analitzar el rendiment de l’aplicació i detectar problemes.

Integració amb eines de monitorització

S’integra amb eines com Prometheus i Grafana, cosa que permet monitoritzar l’aplicació i recopilar mètriques.

Integració amb eines de monitoratge de transaccions

Nest.js es pot integrar amb eines com ara APM (Application Performance Monitoring) per monitoritzar el rendiment i la disponibilitat de l’aplicació.

Integració amb eines de logging

Nest.js s’integra amb eines de logging com Winston i Log4js, cosa que facilita la recopilació i l’anàlisi de missatges de registre.

Integració amb eines d’integració continua

Es pot integrar amb eines com Jenkins i Travis CI, cosa que facilita la integració contínua i el desplegament automatitzat.

Integració amb eines d’anàlisi de codi

Es pot integrar amb eines com SonarQube i Code Climate, cosa que permet analitzar el codi de l’aplicació i detectar problemes de qualitat i seguretat.

Integració amb eines de gestió de configuració

Es pot integrar amb eines com Consul i Vault, cosa que permet gestionar la configuració de l’aplicació de forma centralitzada i segura.

Integració amb eines de seguretat

Es pot integrar amb eines com Auth0 i Okta, cosa que permet implementar mecanismes d’autenticació i autorització de forma ràpida i segura.

Documentació i comunitat

Compta amb una completa documentació i una activa comunitat de desenvolupadors que poden ajudar a resoldre problemes i aprendre més sobre el marc.

Quines llibreries de tercers podem integrar a Nest.js?

librerías-terceros-integrar-Nest.js-Itequia

A més a més, Nest.js ve amb una àmplia gamma de llibreries de tercers integrades que faciliten el desenvolupament d’aplicacions. Algunes de les llibreries més populars inclouen:

Express

Un framework de desenvolupament de servidor web que proporciona una àmplia varietat d’eines per manejar sol·licituds HTTP i enviar respostes.

GraphQL

Un llenguatge de consulta i un conjunt d eines per treballar amb bases de dades i API de manera més eficient.

MongoDB

Una base de dades NoSQL que permet emmagatzemar i recuperar dades de manera senzilla.

Passport

Un conjunt de mòduls que faciliten la implementació de l’autenticació i l’autorització a les aplicacions.

Socket.io

Una biblioteca que permet la comunicació en temps real entre el servidor i els clients.

Hands-on |Implementant un primer controlador amb Nest.js

Un cop vistes les principals característiques i funcions de Nest.js, crearem una aplicació de mostra a Nest.js.

L’aplicació consistirà en un controlador CRUD simple per gestionar una entitat d’usuari. Al controlador se li injectarà un servei per gestionar la lògica de negoci relativa a l’usuari. Alhora, el servei manipularà les dades d’usuari mitjançant un repositori d’usuaris injectat

Aquest codi mostra la implementació del repositori d’usuaris, que és l’encarregat de desar les dades i consultar-les.

Nota CleanCode – Per simplificar l’article, s’emmagatzemen dades en memòria, encara que hauríeu d’emmagatzemar dades en una BBDD com MongoDB. A més, aquesta capa de dipòsit no implementa el patró dipòsit heretant d’una interefície estàndard IRepository, encara que seria el recomanable.

import { Injectable } from '@nestjs/common';

import { User } from './user.entity';

@Injectable()

export class UserRepository {

private users: User[] = [];

findAll(): User[] {

return this.users;

}

findOne(id: number): User {

return this.users.find(user => user.id === id);

}

create(user: User): void {

this.users.push(user);

}

update(id: number, user: User): void {

const index = this.users.findIndex(u => u.id === id);

this.users[index] = user;

}

delete(id: number): void {

this.users = this.users.filter(user => user.id !== id);

}

}

Per implementar el servei que utilitza el repositori, creem una interfície que defineixi els mètodes que volguem exposar. Després, creem una classe de servei que implementi la interfície i utilitzi el repositori per realitzar les operacions de CRUD necessàries.

import { Injectable } from '@nestjs/common';

import { UserRepository } from './user.repository';

import { User } from './user.entity';

export interface IUserService {

findAll(): User[];

findOne(id: number): User;

create(user: User): void;

update(id: number, user: User): void;

delete(id: number): void;

}

@Injectable()

export class UserService implements IUserService {

constructor(private readonly userRepository: UserRepository) { }

findAll(): User[] {

return this.userRepository.findAll();

}

findOne(id: number): User {

return this.userRepository.findOne(id);

}

create(user: User): void {

this.userRepository.create(user);

}

update(id: number, user: User): void {

this.userRepository.update(id, user);

}

delete(id: number): void {

this.userRepository.delete(id);

}

}

Amb els passos anteriors llestos, ja podem crear el controlador que haurà de definir els mètodes del controlador que manejaran les sol·licituds HTTP i utilitzaran el servei d’usuaris injectat al constructor per realitzar les operacions de CRUD necessàries.

import { Controller, Get, Post, Put, Delete, Body } from '@nestjs/common';

import { UserService } from './user.service';

import { User } from './user.entity';

@Controller('users')

export class UserController {

constructor(private readonly userService: UserService) { }

@Get()

findAll(): User[] {

return this.userService.findAll();

}

@Get(':id')

findOne(id: number): User {

return this.userService.findOne(id);

}

@Post()

create(@Body() user: User): void {

this.userService.create(user);

}

@Put(':id')

update(id: number, @Body() user: User): void {

this.userService.update(id, user);

}

@Delete(':id')

delete(id: number

): void {

this.userService.delete(id);

}

}

Finalment encapsulem tota aquesta lògica en el seu mòdul (com ho faríem a Angular), el qual és l’encarregat d’importar el controlador i els serveis que hem injectat als respectius constructors de cada classe.

import { Module } from '@nestjs/common';

import { UserController } from './user.controller';

import { UserService } from './user.service';

import { UserRepository } from './user.repository';

@Module({

controllers: [UserController],

providers: [UserService, UserRepository],

})

export class UserModule { }

Val la pena utilitzar Nest.js?

En conclusió, Nest.js és un marc d’aplicacions de Node.js potent i flexible que s’utilitza per crear aplicacions web i de servidor amb un enfocament a la modularització i l’escala.

La seva integració amb TypeScript i Angular el converteixen en una opció atractiva per als desenvolupadors que busquen fer servir eines modernes i suport per a la programació orientada a objectes.

A més, la seva àmplia comunitat i recursos disponibles el fan fàcil aprendre i utilitzar per als desenvolupadors.

En general, podríem dir que Nest.js és una bona opció per considerar si esteu buscant un marc d’aplicacions de Node.js per crear aplicacions web i de servidor d’alta qualitat.

Tot i això, és important tenir en compte que Nest.js no és l’única opció disponible per crear aplicacions de Node.js. Hi ha molts altres marcs i eines (Frameworks com Express, Koa, Hapi o Fastify.) que també poden ser adequats per al vostre projecte, i és important avaluar les diferents opcions disponibles i triar la que millor s’adapti a les vostres necessitats i preferències.

És important tenir en compte que el rendiment i l’escalabilitat són factors importants que cal considerar a l’hora d’escollir un marc d’aplicacions de Node.js. Alguns marcs poden ser més ràpids i fàcils d’escalar que altres, i és important avaluar aquests factors per assegurar-se que el marc que trieu sigui adequat per a les vostres necessitats.

A més, és important considerar la mida i complexitat del projecte en triar un marc. Si el vostre projecte és petit i simple, és possible que un marc més lleuger i minimalista sigui adequat. Si és gran i complex, és possible que necessiteu un marc més robust i complet que proporcioni més funcionalitats i eines.

T’ interessa utilitzar Nest.js per desenvolupar aplicacions web o de Backend, us recomanem que consulteu la documentació oficial de Nest.js per obtenir més informació sobre com utilitzar el marc i totes les seves característiques. També podeu cercar tutorials en línia i exemples de codi per obtenir una idea de com s’utilitza Nest.js a la pràctica.

Sergi Forns – Key Software Developer at Itequia