¿Cómo implementar una aplicación Express.js?

Elegir la opción de implementación correcta es fundamental para garantizar que su aplicación pueda escalar fácilmente a medida que crece.

Este artículo explora las diferentes opciones de implementación disponibles para las aplicaciones Express.js. En concreto, se centra en cómo implementar aplicaciones Express.js en un contenedor Back4app.

¿Qué es Express.js?

Express es un marco liviano y sin opiniones creado sobre Node.js que simplifica el proceso de creación de API web y móviles complejas.

Ofrece un sistema de enrutamiento simple que le ayuda a definir fácilmente puntos finales para rutas API y asignarlos a funciones del controlador.

También tiene soporte de middleware que le permite agregar funcionalidad como registro, autenticación y manejo de errores en el ciclo de solicitud-respuesta.

Ventajas de utilizar Express.js

Algunas de las ventajas de utilizar Express son:

  • Minimalista y fácil de usar: Express.js abstrae la complejidad de algunas de las características de Node.js, como el enrutamiento. Proporciona una forma sencilla de gestionar las solicitudes y respuestas de la API.
  • Altamente extensible: Express.js tiene una gran comunidad que da como resultado un extenso ecosistema de paquetes y extensiones NPM que puede integrar fácilmente en las aplicaciones.
  • Alto rendimiento: debido a su diseño minimalista y al aprovechamiento de la arquitectura basada en eventos y sin bloqueos de Node, Express tiene un alto rendimiento.
  • Fuerte apoyo de la comunidad: Express.js existe desde 2010. Durante este tiempo, muchos desarrolladores lo han adoptado. Por lo tanto, existe una gran comunidad en Express que puede ayudarle si se queda atascado. Además, hay muchos artículos, tutoriales y documentos bien escritos que explican cómo funciona Express.

Desventajas de Express.js

Las siguientes son algunas de las desventajas de Express.js:

  • Sin opiniones: en comparación con frameworks como Nest.js, Express.js tiene muchas opiniones. Esta falta de opiniones significa que debe tomar decisiones sobre la estructura y la organización del proyecto, lo que puede ser tedioso, especialmente cuando tiene varias formas de hacer las cosas.
  • Carece de funciones integradas: Express.js no viene preconfigurado y para la mayoría de las funciones avanzadas, como el registro, es necesario instalar dependencias adicionales.

Opciones de implementación de Express.js

Infraestructura como servicio (IaaS)

Infraestructura como Servicio es un servicio de computación en la nube que ofrece recursos informáticos, de red y de almacenamiento a través de Internet bajo demanda.

Con IaaS, usted es responsable de aprovisionar y configurar los recursos para su aplicación, mientras que el proveedor de IaaS mantiene la infraestructura física subyacente.

Por ejemplo, si desea implementar una aplicación Express, puede crear y configurar una máquina virtual en el proveedor de IaaS que elija.

En la máquina virtual, debe instalar las dependencias necesarias, como Node y npm, y luego agregar el código Express a la máquina virtual.

Luego, puede iniciar su aplicación Express en la máquina virtual y podrá acceder a ella a través de Internet.

Una de las principales ventajas de IaaS es el nivel de control que proporciona. Puede personalizar los recursos de CPU, memoria y almacenamiento de la máquina virtual para que se adapten a las necesidades de su aplicación.

Sin embargo, es importante considerar algunas desventajas de este enfoque.

Administrar la infraestructura y los recursos a medida que sus aplicaciones escalan y la demanda cambia puede ser una tarea compleja y requerir mucho tiempo.

Algunos de los proveedores de IaaS más populares incluyen:

  • Microsoft Azure
  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)

Contenedor como servicio (CaaS)

Contenedor como servicio (CaaS) es un módulo de servicio en la nube que abstrae la infraestructura subyacente, lo que le permite implementar y ejecutar rápidamente aplicaciones en contenedores.

Para implementar la aplicación Express en un proveedor de CaaS, empaqueta el código, las dependencias y el entorno de ejecución necesarios para ejecutar la aplicación en un contenedor mediante una herramienta de contenedorización como Docker.

Una vez que haya creado el contenedor, impleméntelo. El proveedor de CaaS aprovisiona y administra la infraestructura necesaria para ejecutar el contenedor por usted.

El principal beneficio de usar CaaS es que el alto nivel de abstracción simplifica la implementación, ya que no necesita preocuparse por configurar la infraestructura de bajo nivel.

En cambio, puede concentrarse en crear la lógica de la aplicación. Además, la contenedorización garantiza que su aplicación se ejecute de manera consistente en múltiples entornos.

Algunos de los proveedores de CaaS más populares incluyen:

  • Back4app Containers
  • Amazon Elastic Container Service (ECS)
  • Google Kubernetes Engine (GKE)

Cómo implementar una aplicación Express en un contenedor Back4app

Prerrequisitos

Para seguir este tutorial, asegúrese de tener lo siguiente:

  • Node.js está instalado en su máquina.
  • Una cuenta de GitHub.
  • Docker está instalado en su equipo. Si no lo tiene, visite el sitio de Docker e instale Docker Desktop.
  • Conocimiento práctico de Express.js.

Descripción general de Back4app Containers

Back4app Containers es una plataforma que automatiza la implementación al administrar la infraestructura del lado del servidor por usted.

Algunas de las características de los contenedores Back4app incluyen las siguientes:

  • Integración de GitHub: puedes conectar tus repositorios de GitHub a Back4app, lo que permite implementaciones automáticas de su aplicación cuando cambia la base del código.
  • Implementación de Docker: puede utilizar Docker, una herramienta de contenedorización popular, para empaquetar el código de su aplicación en un contenedor. Esto garantiza que su aplicación funcione de manera predecible en todos los entornos.
  • Implementaciones automáticas: una vez que haya conectado el repositorio de GitHub a Back4app, cada envío de código a la rama predeterminada activará la implementación.
  • Seguimiento de implementaciones en tiempo real: puede ver el estado y el progreso de sus implementaciones.
  • Monitoreo de aplicaciones en tiempo real
  • Actualizaciones sin tiempo de inactividad

Introducción del proyecto

En esta guía, repasaremos el proceso de implementación de una aplicación Express en Back4app. Primero, crearemos una API REST Express simple con un único punto final, la convertiremos en un contenedor Docker y luego la enviaremos a GitHub. Luego, la implementaremos en un contenedor Back4app.

Crear una API Express sencilla

Siga los pasos a continuación para crear una aplicación Express:

  1. Ejecute el siguiente comando en su terminal para inicializar un nuevo proyecto Node.js.
npm init

Este comando le solicitará que ingrese los detalles de su aplicación, como el nombre del paquete, la versión, la descripción, el punto de entrada, el autor y la licencia. Una vez que responda, se creará un archivo package.json con estas configuraciones.

Para utilizar las configuraciones predeterminadas, utilice el indicador -y como se muestra a continuación:

npm init -y
  • Instale Express como una dependencia ejecutando este comando.
npm install express
  • En la raíz de la carpeta de su proyecto, cree un archivo index.js. Si especificó otro nombre para el archivo de punto de entrada, úselo.
  • Abra el archivo index.js y cree una instancia de la aplicación Express.
const express = require('express');
const app = express();
  • Agregue un controlador de ruta para manejar solicitudes GET al punto final “/”.
app.get("/", (req, res) => {
  res.json({
    message: "Success",
  });
});

Este punto final envía un mensaje JSON como respuesta.

  • Defina el número de puerto y escuche las solicitudes entrantes en el puerto especificado.
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`App listening at <http://localhost>:${port}`);
});

Tenga en cuenta que process.env. PORT hace referencia a una variable de entorno denominada PORT. Si este valor no está definido en el archivo .env, la aplicación utilizará el valor 3000.

  • Ejecute el siguiente comando para iniciar el servidor Express.
node index.js

Si visita http://localhost:3000/api en su navegador, debería recibir la siguiente respuesta.

{
  "message": "Success!"
}

Este es un ejemplo muy básico de una API Express y una aplicación real sería más compleja con más puntos finales, datos externos, middleware, etc.

Para los fines de este artículo, esto es suficiente para demostrar cómo se puede implementar una aplicación Express dockerizada.

Dockerización de la aplicación Express

Dockerizar una aplicación Express.js se refiere a crear un contenedor Docker para que sea más fácil ejecutar la aplicación en diferentes entornos.

¿Qué es Docker?

Docker es una herramienta de código abierto que le permite empaquetar su aplicación, su entorno de ejecución, bibliotecas y dependencias en un entorno de contenedor aislado y portátil.

Al encapsular la aplicación dentro de este contenedor, Docker proporciona un entorno consistente para que la aplicación se ejecute independientemente del sistema host subyacente.

Esto elimina el problema de que “funciona en mi máquina”. Puede trabajar en su aplicación Express en su entorno local, contenerla e implementarla en múltiples entornos sin preocuparse por problemas de compatibilidad.

Instalar Docker

Docker puede ejecutarse en varias plataformas, incluidas macOS, Windows y Linux. Puede descargar e instalar Docker para su sistema operativo desde el sitio web oficial.

Cómo dockerizar una aplicación Express.js

Una vez que haya instalado Docker, debe dockerizar su aplicación, es decir, debe empaquetarla en un contenedor Docker.

Siga los pasos a continuación:

  • En la raíz de su proyecto, cree un archivo llamado Dockerfile. Este archivo contiene las instrucciones para crear la imagen de Docker para la aplicación Express.
  • Por lo general, al crear el Dockerfile, lo primero que se hace es especificar una imagen base. Una imagen base es una imagen predefinida que actúa como punto de partida para la imagen de la aplicación y, por lo general, contiene instrucciones mínimas para ejecutar la aplicación.
  • En el Dockerfile, puedes proporcionar instrucciones y configuraciones que se ejecutarán sobre esta imagen. Puede crear su propia imagen base personalizada, pero Docker tiene imágenes oficiales que son suficientes en la mayoría de los casos.
  • En esta guía, utilizaremos la imagen base del nodo, específicamente la variante alpina, que es de tamaño pequeño. Especificaremos esta imagen base en el Dockerfile agregando lo siguiente.
FROM node:20-alpine

Aquí, node:20-alpine viene preinstalado con Node.js versión 20.

  • Agregue la siguiente línea para establecer el directorio de trabajo dentro del contenedor.
WORKDIR /usr/src/app
  • Copie package.json y package-lock.json en el directorio de trabajo. Esto incluye todas las dependencias que Docker debe instalar.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
  • Agregue el comando para instalar las dependencias.
RUN npm install
  • Copie el resto del código al directorio de trabajo en el contenedor.
COPY . .
  • Exponga el número de puerto que escucha la aplicación Express. En este caso, el puerto 3000.
expose 3000
  • Añada el comando para iniciar la aplicación.
CMD["node", "index.js"]

En general, su DockerFile debería verse así:

FROM node:20-alpine

WORKDIR /usr/src/app

COPY package*.json  ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "node", "index.js" ]

Agregar un archivo .dockerignore

Un archivo .dockerignore especifica los archivos que Docker debe ignorar. Le ayuda a reducir el tamaño de la imagen de Docker al permitirle ignorar archivos innecesarios. También le ayuda a ocultar archivos confidenciales de la imagen.

Para agregarlo a su proyecto, cree un archivo en la base de su proyecto y nómbrelo .dockerignore. Agregue el siguiente contenido.

.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*

El archivo anterior evita que los archivos git, los módulos de nodo, los registros y las variables de entorno se copien a la imagen de Docker.

Construir la imagen de Docker localmente

En el directorio de su proyecto, ejecute el siguiente comando para crear la imagen de Docker.

docker build -t docker-express-api .

El indicador -t significa etiqueta y permite darle a la imagen de Docker un nombre significativo. El punto (.) al final le indica a Docker que busque el Dockerfile en el directorio actual y ejecute las instrucciones dentro de él.

Ejecutar la imagen de Docker localmente

Una vez que haya creado la imagen de Docker, úsela para ejecutar la aplicación Express usando el siguiente comando:

docker run -p 3000:3000 docker-express-api

Aquí -p 3000:3000 asigna el puerto 3000 del host local al puerto 3000 del contenedor. Debería poder acceder a la aplicación visitando http://localhost:3000 en el navegador.

Para ver la instancia de Docker en ejecución, utilice el siguiente comando:

docker ps

Para detener la instancia, ejecute:

docker stop docker-express-api

Implementación de una aplicación Express Dockerizada en un contenedor Back4app

Ahora que nos hemos asegurado de que la imagen de Docker se ejecuta localmente, debemos implementarla en Back4app.

Enviar la aplicación Express a GitHub

Backapp implementa su aplicación desde GitHub. Por lo tanto, debe enviar el repositorio de la aplicación a GitHub siguiendo los pasos que se indican a continuación:

  • Vaya al sitio de GitHub e inicie sesión en su cuenta.
  • Después de iniciar sesión, busque el ícono “+” en la esquina superior derecha de la página y haga clic en él. En el menú desplegable, seleccione “Nuevo repositorio”.
  • En la página “Crear un nuevo repositorio”, dele un nombre a su repositorio. Para esta guía, usaremos “express-api”. Haga clic en el botón “Crear nombre de repositorio”. Recuerde la URL del repositorio en la página siguiente, ya que la necesitará para enviar el repositorio local a GitHub.

En su máquina local, navegue a la carpeta de su proyecto y ejecute el siguiente comando para enviar la aplicación al repositorio remoto en GitHub.

git remote add origin <https://github.com/remigathoni/express-api.git>
git branch -M main
git push -u origin main

Debería poder ver los archivos de su aplicación en el repositorio de GitHub.

Implementar la aplicación Express

Siga los pasos a continuación para implementar la aplicación en Back4app:

  • En el panel de control, haga clic en el botón Crear una nueva aplicación. Se le presentarán dos opciones: Backend como Servicio y Contenedor como Servicio. BaaS se encarga del backend en su nombre, mientras que CaaS le permite implementar su aplicación en un entorno contenedorizado. Dado que solo queremos implementar la aplicación, haga clic en Contenedores como Servicio.
Create a new container as a service app
  • Cuando se le solicite, otorgue a Back4app acceso a su cuenta de GitHub y seleccione el repositorio Express.
Select the dockerized Express app
  • Dele un nombre a su aplicación implementada. En esta guía, usamos “Deployed Express API”. También puede configurar opciones de implementación adicionales, como la rama predeterminada, el directorio raíz, el estado de implementación automática (sí o no) y las variables de entorno.
Deploy Express.js application to
  • Haga clic en el botón Crear aplicación para finalizar el proceso de implementación.

Ahora ha implementado su aplicación Express en Back4app de forma gratuita.

Cómo optimizar la imagen de Docker

Es fundamental optimizar el tamaño de la imagen de Docker por los siguientes motivos:

  • Rendimiento mejorado: una imagen pequeña no incluye capas innecesarias que deben ejecutarse, lo que genera tiempos de inicio más rápidos.
  • Implementación más rápida: las imágenes más pequeñas se implementan más rápido.
  • Menor consumo de recursos: las imágenes más pequeñas consumen menos espacio en disco y memoria cuando se ejecutan.
  • Seguridad mejorada: al excluir bibliotecas y dependencias innecesarias, las imágenes más pequeñas reducen la superficie de ataque de la aplicación.

Para optimizar la imagen Docker de Express.js, podemos utilizar una compilación de varias etapas.

Las compilaciones en varias etapas le permiten separar el entorno de compilación del entorno de ejecución. Puede compilar la aplicación en la etapa de compilación y luego copiar solo los archivos necesarios en la etapa de producción final.

Volviendo a la aplicación Express, podemos definir dos etapas: la etapa de compilación donde instalaremos las dependencias y la página de producción donde crearemos la imagen de tiempo de ejecución.

Creación de la etapa de construcción

Siga las instrucciones a continuación para definir la etapa de compilación:

  • Elimine todo el contenido del Dockerfile y define la etapa de compilación desde la imagen base.
FROM node:20-alpine AS build

Se nombra una etapa agregando AS name-of-stage a la instrucción FROM. Tenga en cuenta también que las imágenes base de Alpine son mucho más pequeñas que las imágenes de node:<version>.

  • Defina el directorio de trabajo.
WORKDIR /usr/src/app
  • Copie los archivos package.json y package-lock.json al contenedor.
COPY package*.json ./
  • Instale las dependencias de desarrollo.
RUN npm install --only=development
  • Copie el código de la aplicación en la etapa de compilación.
COPY . .
  • Ejecute la aplicación.
CMD ["node", "index.js"]

El comando que ejecute aquí depende de su proyecto. Por ejemplo, si ha utilizado TypeScript para crear su aplicación, es posible que deba transpilarla.

Creando la etapa de producción

En la segunda etapa, copiará únicamente los archivos de la aplicación compilada desde la etapa de compilación. Siga los pasos a continuación:

  • Agregue la imagen base de Node.js y nómbrela producción.
# Production Stage
FROM node:20-alpine AS production
  • Establezca el directorio de trabajo.
WORKDIR /usr/src/app
  • Copie los archivos necesarios de la “Etapa de compilación” especificando –from=build en la instrucción COPY. Como no hay un comando de compilación, copiamos todo directamente.
COPY --from=build /usr/src/app .
  • Exponga el puerto en el que escucha su aplicación Express.
EXPOSE 3000
  • Inicie la aplicación Express.
CMD ["node", "index.js"]

Después de crear el Dockerfile, envíe los cambios a GitHub y Back4app volverá a implementar automáticamente su aplicación.

Si desea ver el código de este artículo, consulte el repositorio de GitHub de la aplicación.

Conclusión

Express.js es un framework Node.js ligero y sin prejuicios que ayuda a los desarrolladores a crear API rápidas y mínimas para aplicaciones web y móviles.

Cuando se trata de implementar aplicaciones Express, tiene varias opciones, incluidas las plataformas de Infraestructura como Servicio (IaaS) y Contenedor como Servicio (CaaS).

Las plataformas IaaS son más adecuadas cuando se desea el máximo control sobre la infraestructura del servidor subyacente, y CaaS es una buena opción cuando se desea pasar del desarrollo a la producción rápidamente sin tener que administrar manualmente la infraestructura.

Uno de los mejores proveedores de CaaS es Back4app Containers. Back4app administra y supervisa la implementación de la aplicación en su nombre, lo que le permite concentrarse en desarrollar las características de la aplicación.

En esta guía, aprendió a convertir una aplicación Express.js en un contenedor de Back4app e implementarla en este. Para obtener más información, visite la documentación de Back4app containers


Leave a reply

Your email address will not be published.