NestJS frente a Express.js

Nota del editor: Este artículo fue actualizado por última vez por Ibiyemi Adewakun el 10 de abril de 2024 para agregar información con pautas para migrar de Express.js a Nest.js y las mejores prácticas para una transición sin problemas.

Es crucial que los desarrolladores tomen una decisión informada al elegir un framework para sus proyectos. NestJS y Express.js son dos de los frameworks más populares en el ecosistema Node.js para crear aplicaciones a gran escala. Este artículo comparará NestJS y Express.js en función de sus características, arquitectura, soporte de la comunidad y más. Explorará sus componentes principales y brindará información sobre sus casos de uso ideales, además de ofrecer pautas para migrar de Express.js a NestJS.

Table
  1. ¿Qué es NestJS?
    1. Componentes principales de NestJS
    2. Cómo instalar NestJS
    3. Características de NestJS
    4. Cómo NestJS utiliza Express
  2. ¿Qué es Express.js?
    1. Cómo instalar Express.js
    2. Características de Express.js
  3. NestJS frente a Express.js
    1. Con opiniones y sin opiniones
    2. Popularidad
    3. Rendimiento
    4. Arquitectura
    5. Pruebas unitarias
    6. Casos de uso
  4. Migración de Express.js a NestJS
    1. Creación y organización del nuevo proyecto Nest
    2. Migrando nuestras rutas a los controladores Nest
    3. Migrando nuestro middleware
  5. Conclusión
  6. Solo el monitor 200s falló y las solicitudes de red fueron lentas en producción

¿Qué es NestJS?

NestJS es un framework Node.js para crear aplicaciones del lado del servidor. Se basa en TypeScript y JavaScript.

Este framework está inspirado en Angular, por lo que la mayor parte de lo que se encuentra en Angular también se puede encontrar en Nest, incluyendo proveedores, middleware, componentes y servicios. Se puede afirmar que Nest es fácilmente accesible para desarrolladores de Angular en cualquier tipo de proyecto.

Una guía para optimizar la experiencia digital del cliente

Nest usa el framework HTTP Express por defecto. Sin embargo, Nest es independiente de la plataforma, lo que significa que puede funcionar con cualquier framework HTTP de Node. Por ejemplo, se puede configurar opcionalmente para usar Fastify , lo que puede mejorar el framework de Node.

Una de las cosas interesantes de NestJS es que todo lo que es compatible con Express (es decir, las funciones Express) también es compatible con Nest.

Componentes principales de NestJS

Repasemos algunos de los componentes principales de NestJS.

Un módulo es una clase anotada con el decorador. Nest utiliza los metadatos proporcionados por el decorador para organizar la estructura de la aplicación.@Module()@Module()

Creación de componentes de terminal basados ​​en web con Termino.js

Cada aplicación NestJS contiene al menos un módulo, conocido como módulo raíz. Nest utiliza este módulo como punto de partida para definir la estructura y las relaciones de la aplicación. Los módulos dinámicos son una potente función del sistema de módulos de Nest. Esta función permite crear fácilmente módulos personalizables que pueden registrar y configurar proveedores dinámicamente. Los proveedores son muy importantes, ya que Nest depende en gran medida de ellos para crear relaciones entre diferentes objetos. Un proveedor puede inyectarse como dependencia.

Las clases como servicios, repositorios y ayudantes pueden tratarse como proveedores; simplemente agregar el decorador de Nest manejará la resolución, lo que hace que la gestión de dependencias sea extremadamente sencilla.@Injectable()

Cuando se recibe una solicitud HTTP, el mecanismo de enrutamiento la dirige al controlador correcto dentro de NestJS. Los controladores gestionan las solicitudes entrantes y responden al cliente de la aplicación.

Cómo instalar NestJS

Nest incluye una excelente CLI que facilita la creación de una aplicación Nest.

Realización de un taller para crear historias de usuario efectivas


En su terminal o símbolo del sistema, escriba lo siguiente:

npm ig @nestjs / cli

Usemos el cdcomando para cambiar al directorio donde queremos compilar nuestra aplicación. Ejecutemos los siguientes comandos:

nido nuevo nido - blog - apicd nest - blog - apinpm ejecutar inicio : dev

Accede a http://localhost:3000 en cualquier navegador. Deberías ver el mensaje “Hola mundo”.

Características de NestJS

Trabajar con Node y Express es ideal para crear aplicaciones pequeñas y ligeras con código fácil de leer. Sin embargo, a medida que las cosas se vuelven más complejas y se añaden más funciones a la aplicación, el código se vuelve un poco más confuso y difícil de gestionar.

5 formas de implementar una animación de escritura en React

Aquí es donde entra NestJS. Nest puede organizar tu aplicación en módulos independientes, cada uno con su propia responsabilidad. Un módulo puede contener controladores y servicios relacionados y mantenerlos relativamente aislados del resto de la aplicación.

Nest también admite la inyección de dependencias . Usarla significa que no necesitas tener una dependencia estricta de elementos como componentes, servicios y middleware dentro de tu código.

Los filtros de excepciones son otra función interesante de Nest. Todas las aplicaciones se enfrentan a excepciones de vez en cuando. La forma en que gestionas las excepciones es importante, y Nest se encarga de todo por ti. Nest incluye una capa de excepciones que se encarga de gestionar todas las excepciones no gestionadas en una aplicación. Cuando una excepción no es gestionada por el código de la aplicación, esta capa la detecta y envía automáticamente una respuesta intuitiva y adecuada.

También obtienes compatibilidad sencilla con MongoDB con Nest. Muchas aplicaciones web desarrolladas con Node utilizan la pila MEAN, que incluye MongoDB, Express, Angular y Node . Una de las bibliotecas más populares para acceder a la base de datos Mongo es Mongoose. Puedes conectarte fácilmente a la base de datos MongoDB y usarla para crear aplicaciones escalables con el paquete Mongoose de NestJS .

Finalmente, como ya mencionamos, NestJS utiliza el framework Express por defecto como canal de procesamiento de solicitudes. Esto significa que si ya está familiarizado con el procesamiento Express, podrá adaptar su middleware Express para usarlo en Nest.

Cómo NestJS utiliza Express

NestJS se puede configurar para usar Express o Fastify como su framework de servidor HTTP y, por defecto, usa Express. La función principal de Express (o del servidor HTTP seleccionado) en NestJS es servir de proxy para el middleware configurado para las rutas y asignar los controladores de las solicitudes HTTP al servidor.

Si bien elegir entre Express o Fastify como servidor HTTP configurado en su proyecto NestJS tiene poco impacto (aparte de unas pocas líneas de código adicionales para Fastify), Express es una excelente opción debido al soporte de su comunidad y al acceso a varias bibliotecas, especialmente middleware y complementos creados para funcionar con Express.

¿Qué es Express.js?

Express es un framework de aplicaciones web Node.js que ofrece una amplia gama de funcionalidades para la creación de aplicaciones web y móviles. Es una capa desarrollada sobre Node que facilita la gestión de servidores y rutas.

Puedes usar Express con Node para crear aplicaciones web de una sola página, multipágina o híbridas. Es compatible con el patrón arquitectónico MVC para el diseño de aplicaciones web : Modelo, Vista y Controlador.

Cómo instalar Express.js

Para utilizar Express en nuestro proyecto, primero tenemos que instalarlo:

npm install express

Luego queremos importar Express dentro de nuestro proyecto:

importar express desde 'express' ; 

A continuación, debemos inicializar nuestra aplicación, asignarle un puerto para escuchar y responder a una solicitud en esa ruta:

const aplicación = express ();aplicación.get ( '/' , ( req , res ) =  {   res.send ( ' ¡Hola mundo!' ) ; }) ;   app . listen ( 3000 , () =   console . log ( '¡Aplicación de ejemplo escuchando en el puerto 3000!' ), );  

Características de Express.js

El middleware es un componente del programa que tiene acceso a una base de datos, a las solicitudes de los clientes y a otro middleware. Es el principal responsable de la organización sistemática de diversas funciones de Express.js.

En lo que respecta al enrutamiento, Express incluye un sofisticado mecanismo de enrutamiento que utiliza URL para preservar el estado de la página web.

Por último, Express incluye motores de plantillas que permiten a los desarrolladores crear contenido dinámico para páginas web mediante la creación de plantillas HTML en el lado del servidor.

NestJS frente a Express.js

En esta sección, compararemos directamente varios aspectos de Nest y Express, incluidos casos de uso de ejemplo para cada uno.

Con opiniones y sin opiniones

Nest es un framework con opiniones firmes. Se adhiere al paradigma de diseño de “convención sobre configuración”, lo que permite a los desarrolladores usar herramientas y código estándar de forma específica, reduciendo así la necesidad de una configuración explícita.

Además, NestJS se basa en Angular, por lo que TypeScript es su lenguaje de programación principal , aunque también se puede usar JavaScript. El uso de TypeScript garantiza que la aplicación sea fiable y esté libre de errores.

Express.js es un framework sin opiniones firmes; es decir, sin opiniones. Esto significa que no tiene un conjunto de reglas predefinidas que seguir. Los desarrolladores suelen aprovechar esta oportunidad para experimentar con diferentes escenarios y escribir código según sea necesario.

Popularidad

En cuanto a qué framework es el más popular, Nest se lleva el título. Con más de 64.000 estrellas en GitHub , Nest es el framework más popular.

Express le sigue de cerca. Cuenta con más de 63.000 estrellas en GitHub , ocupando el segundo lugar entre los frameworks Node.js mejor valorados por GitHub .

Rendimiento

Express puede ejecutar múltiples operaciones de forma independiente mediante programación asíncrona. Nest utiliza el framework Express por defecto.

Sin embargo, Nest también ofrece una forma alternativa de cambiar el marco subyacente de Express a Fastify para obtener un rendimiento significativamente mejorado.

Arquitectura

Nest ofrece una arquitectura de aplicaciones lista para usar que utiliza controladores, proveedores y módulos. Esto permite a los desarrolladores y equipos crear aplicaciones fáciles de probar y mantener.

Express no requiere una estructura específica , lo que ofrece flexibilidad a equipos de desarrollo pequeños o de una sola persona. Sin embargo, esto puede convertirse en un problema a medida que aumenta el tamaño del equipo o la complejidad de la aplicación, especialmente si los desarrolladores trabajan en diferentes aspectos de la aplicación.

Pruebas unitarias

La CLI de Nest incluye un entorno de pruebas predeterminado basado en Jest . Al crear un servicio, un interceptor o un controlador, la CLI genera un archivo de especificaciones. Este archivo incluye código de banco de pruebas generado automáticamente, lo que elimina la necesidad de que los desarrolladores escriban código adicional para las pruebas unitarias.

En Express, las pruebas unitarias requieren la construcción de códigos distintos, lo que lleva tiempo y puede ralentizar la productividad de una aplicación.

Casos de uso

Algunos ejemplos de desarrollos con NestJS incluyen aplicaciones web empresariales y de comercio electrónico. Las aplicaciones NestJS escalan bien, lo que las hace perfectas para aplicaciones empresariales de gran tamaño. No es de extrañar que empresas líderes como Adidas, Roche, Trilon y otras utilicen Nest .

También podemos construir fácilmente sitios web de comercio electrónico combinando NestJS con un marco frontend como React, Angular o Vue.

Ejemplos de lo que se puede crear con Express.js incluyen aplicaciones fintech y aplicaciones de streaming. El software u otra tecnología utilizada para respaldar o facilitar los servicios bancarios y financieros se conoce como fintech. Cada vez más instituciones financieras crean aplicaciones fintech, y Express es el framework predilecto para crear aplicaciones financieras altamente escalables.

Los servicios de streaming en tiempo real son complejos, con múltiples niveles de flujos de datos. Para crear una aplicación de este tipo, necesitará un framework robusto como Express.js, capaz de gestionar eficientemente flujos de datos asíncronos.

Migración de Express.js a NestJS

Imaginemos que has llegado hasta aquí y has decidido migrar tu proyecto Express a NestJS. En esta sección, repasaremos algunos pasos y ejemplos para migrar tu proyecto a NestJS.

Antes de empezar a escribir código, lo primero que necesitamos es definir la estructura de nuestro proyecto. Nest se basa fundamentalmente en la organización del proyecto (en NestJS, los organizamos en módulos) y las dependencias que existen entre ellos. Debemos considerar esto con antelación para evitar una dependencia circular.

Una vez que hayamos decidido cómo estructurar nuestro proyecto, ¡podemos pasar a escribir algo de código!

Para los fines de esta sección y algunos ejemplos de código, imaginemos que estamos migrando un servicio de API de libro de cocina y moviendo dos recursos a NestJS: uno para crear una receta (POST) y otro para devolver una lista de recetas (GET).

Encuentre nuestro ejemplo de API de Express Cookbook aquí .

Creación y organización del nuevo proyecto Nest

Primero lo primero, creemos nuestro nuevo proyecto Nest ejecutando esto:

$ nuevo libro de cocina - api

A continuación, configuraremos nuestros módulos creando el directorio de módulos de recetas. Para este proyecto, solo tendremos un módulo recipes:

$ cd libro de recetas - api / srcRecetas de $mkdir

Cada módulo en NestJS tiene una clase de módulo anotada con un decorador donde organizamos nuestro módulo definiendo sus componentes. Nuestro archivo de módulo de receta se llamará y contendrá lo siguiente:@Module()recipes.module.ts

// recetas.module.ts importar { Módulo } desde '@nestjs/common' ; importar { RecipesController } desde './recipes.controller' ;          @Module ({}) exporta la clase RecipesModule {}   

En este punto de nuestra migración, aún no hemos creado controladores ni proveedores, así que está bastante vacío. Echa un vistazo a nuestro módulo con más funcionalidad aquí .

Migrando nuestras rutas a los controladores Nest

Ahora, podemos comenzar a escribir código traduciendo nuestras rutas Express al controlador NestJS.

Aquí está nuestro archivo de ruta de recetas Express:

// recetas.tsimportar { Enrutador , Solicitud , Respuesta } de 'express' importar { GetAllRecipesFilters } de '../../db/dal/types'            importar * como controlador desde '../controllers/recipes' importar { CreateRecipeDTO } desde '../dto/recipe.dto' importar { checkCache } desde '../../lib/check-cache'          const recetasRouter = Router () // listado de recursos recetasRouter.get ( ' / ' , checkCache , async ( req : Solicitud , res : Respuesta ) =  { const filtros : GetAllRecipesFilters = req.query                const resultados = await controlador . getAll ( filtros )     devolver res.estado ( 200 ) .enviar ( resultados ) } )​// creando recetas de recursosRouter.post ( ' / ' , async ( req : Solicitud , res : Respuesta ) =  { const payload : CreateRecipeDTO = req.body                const resultado = await controlador . crear ( carga útil )     devolver res.estado ( 200 ) .enviar ( resultado ) } )​

En NestJS, crearemos un nuevo controlador en nuestro módulo para albergar estos recursos:recipes.controller.tsrecipes

// recetas.controller.tsimport { Cuerpo, Controlador, Obtener, Inyectar, Publicar, Consultar } de '@nestjs/common'; importar { CreateRecipeDTO, RecipesFilterDto } de './recipes.dto'; importar { RecipeEntity } de './recipe.entity'; importar { RecipesService } de './recipes.service'; @Controller('recipes') exportar clase RecipesController { constructor(@Inject(RecipesService) privado RecipesService: RecipesService) {} @Get() obtenerTodo(@Query() filtros: RecipesFilterDto): PromiseRecipeEntity[] { devolver este.recipesService.findAll(filtros); } @Post() crear(@Body() carga útil: CreateRecipeDTO): PromiseRecipeEntity { devolver este.recipesService.create(carga útil); }}

Anteriormente, definimos nuestros recursos GET y POST compatibles mediante los decoradores de Nest para especificar la función que gestiona cada recurso. También definimos una interfaz de objeto para los filtros de nuestro recurso de listado en nuestro archivo DTO recipes.dto.tsmediante el @Query()decorador, así como un tipo de DTO para la carga útil creada mediante el @Body()decorador.

Para mayor claridad, mantendremos la lógica de ejecución de recursos fuera del controlador y en un archivo de servicio dedicado recipes.service.ts. Sin embargo, por razones de brevedad, no analizaremos el contenido de dicho archivo. Puede consultarlo recipes.service.tsaquí.

DTO significa objeto de transferencia de datos. En nuestro archivo DTO, definimos los puntos de datos que requerimos y admitimos de los usuarios de nuestra API. Es recomendable separar el contrato de recursos de la API de la lógica interna.

Migrando nuestro middleware

Ahora que tenemos un controlador y la lógica de nuestros recursos en los servicios, la siguiente parte importante de nuestro proyecto Express es migrar el middleware (donde tenga alguno).

Nuestra API Express utilizaba un middleware llamado checkCache, que buscaba y devolvía resultados de listados en caché si estaban disponibles, en lugar de volver a consultar nuestra base de datos. En este paso de nuestra migración, crearemos este middleware en nuestra API NestJS.

Dado que nuestro checkCachemiddleware probablemente se aplicará a todos GETlos recursos, no lo implementaremos dentro del módulo de recetas. En su lugar, lo colocaremos en un nuevo directorio llamado common, donde almacenaremos el código de utilidad compartida de nuestra API:

$ mkdir common$ cd common$ mkdir middleware

Ahora creamos el check-cache.middleware.tsarchivo:

// check-cache.middleware.tsimport { Injectable, NestMiddleware } de '@nestjs/common'; importar { Solicitud, Respuesta, NextFunction } de 'express'; importar LocalCache de '../local-cache'; @Injectable() exportar clase CheckCacheMiddleware implementa NestMiddleware { usar(req: Solicitud, res: Respuesta, next: NextFunction) { intentar { const { baseUrl, método } = req; const [, , , cacheKey] = baseUrl.split('/'); si (método === 'GET' LocalCache.hasKey(cacheKey)) { const datos = LocalCache.get(cacheKey); devolver res.status(200).send(datos); } next(); } catch (err) { lanzar err; } }}

Ahora podemos registrar este check-cachemiddleware y aplicarlo a los recursos relevantes en nuestra clase AppModule app.module.ts:

// app.module.tsimport { Módulo, NestModule, MiddlewareConsumer, RequestMethod,} de '@nestjs/common';import { AppController } de './app.controller';import { AppService } de './app.service';import { RecipesModule } de './recipes/recipes.module';import { CheckCacheMiddleware } de './common/middleware/check-cache.middleware';@Module({ importaciones: [RecipesModule], controladores: [AppController], proveedores: [AppService],})exportar clase AppModule implementa NestModule { configure(consumidor: MiddlewareConsumer) { consumidor .apply(CheckCacheMiddleware) .forRoutes({ ruta: 'recipes', método: RequestMethod.GET }); }}

En el app.module.tscódigo anterior, aplicamos el check-cachemiddleware a los recursos GET de la receta usando la forRoutesopción.

Los pasos anteriores cubren las partes principales de la migración de una aplicación Express a NestJS si decide hacer el cambio.

Conclusión

Según algunos desarrolladores, si ya usas NestJS, vas un paso por delante. Este framework te da una ventaja significativa desde el principio y también te ayuda a llevar tu backend de Node al siguiente nivel al estructurar correctamente tu aplicación.

Sin embargo, Express.js es uno de los mejores y más populares frameworks de desarrollo backend que usan JavaScript, y probablemente seguirá siéndolo por un tiempo. ¿Qué opción prefieres? ¡Comparte tu opinión en la sección de comentarios!

Solo el monitor 200s falló y las solicitudes de red fueron lentas en producción

Implementar una aplicación web o un sitio web basado en Node es la parte fácil. Asegurarse de que la instancia de Node siga proporcionando recursos a la aplicación es la parte más difícil. Si le interesa garantizar que las solicitudes al backend o a servicios de terceros se ejecuten correctamente, pruebe LogRocket.

Si quieres conocer otros artículos parecidos a NestJS frente a Express.js puedes visitar la categoría Guias.

Entradas Relacionadas