Cómo Diferenciar el Entorno de Desarrollo y el Entorno de Producción y su Configuración (NestJS + MySQL + TypeScript)

  • 526Palabras
  • 3Minutos
  • 06 Jul, 2024

En el artículo anterior https://es.blog.jasonzk.com/nestjs/nesttsmysql/, explicamos detalladamente cómo configurar un entorno de desarrollo NestJS + MySQL + TypeScript. En este artículo, explicaremos detalladamente cómo diferenciar entre entornos de desarrollo y producción, la carga de configuraciones diferentes y cómo usar PM2 para desplegar proyectos NestJS en producción.

Uso de Variables de Entorno para Diferenciar Entornos

Primero, necesitamos crear dos archivos de variables de entorno en el directorio raíz del proyecto: .env.development y .env.production, para los entornos de desarrollo y producción, respectivamente, e instalar dotenv.

.env.development

Terminal window
1
NODE_ENV=development
2
DB_HOST=localhost
3
DB_PORT=3306
4
DB_USERNAME=root
5
DB_PASSWORD=password
6
DB_DATABASE=test

.env.production

Terminal window
1
NODE_ENV=production
2
DB_HOST=your-production-host
3
DB_PORT=3306
4
DB_USERNAME=your-production-username
5
DB_PASSWORD=your-production-password
6
DB_DATABASE=your-production-database

Instalar dotenv

Terminal window
1
npm install dotenv

Crea un directorio config en el directorio src y dentro de él, crea un archivo configuration.ts para cargar las variables de entorno:

1
import * as dotenv from "dotenv";
2
3
const env = process.env.NODE_ENV || "development";
4
5
dotenv.config({ path: `.env.${env}` });
6
7
export default () => ({
8
environment: env,
9
database: {
10
host: process.env.DB_HOST,
11
port: parseInt(process.env.DB_PORT, 10) || 3306,
12
username: process.env.DB_USERNAME,
13
password: process.env.DB_PASSWORD,
14
database: process.env.DB_DATABASE,
15
},
16
});

Configuración de Conexiones de Base de Datos Diferentes

A continuación, en src/app.module.ts, utiliza ConfigModule y TypeOrmModule para cargar la configuración de la base de datos:

1
import { Module } from "@nestjs/common";
2
import { ConfigModule, ConfigService } from "@nestjs/config";
3
import { TypeOrmModule } from "@nestjs/typeorm";
4
import configuration from "./config/configuration";
5
import { UsersModule } from "./users/users.module";
6
import { User } from "./users/user.entity";
7
import { AppController } from "./app.controller";
8
import { AppService } from "./app.service";
9
10
@Module({
11
imports: [
12
ConfigModule.forRoot({
13
isGlobal: true,
14
load: [configuration],
15
}),
16
TypeOrmModule.forRootAsync({
17
imports: [ConfigModule],
18
useFactory: (configService: ConfigService) => ({
19
type: "mysql",
20
host: configService.get("database.host"),
21
port: configService.get("database.port"),
22
username: configService.get("database.username"),
23
password: configService.get("database.password"),
24
database: configService.get("database.database"),
25
entities: [User],
26
synchronize: true,
27
}),
28
inject: [ConfigService],
29
}),
30
UsersModule,
31
],
32
controllers: [AppController],
33
providers: [AppService],
34
})
35
export class AppModule {}

Carga de Archivos de Configuración Diferentes

Para asegurar la carga de archivos de configuración, el método forRoot de ConfigModule debe configurar correctamente las opciones isGlobal y load, y el método forRootAsync de TypeOrmModule se utiliza para cargar la configuración de forma asíncrona y utilizar ConfigService para obtener la información de conexión a la base de datos.

Iniciar el Proyecto en el Entorno de Desarrollo

En el entorno de desarrollo, usa el comando start de Nest CLI para iniciar el proyecto:

Terminal window
1
npm run start

Desplegar el Proyecto en el Entorno de Producción

En el entorno de producción, recomendamos usar PM2 para gestionar y ejecutar proyectos NestJS.

Instalar PM2

Primero, instala PM2 globalmente:

Terminal window
1
npm install -g pm2

Configurar PM2

En el directorio raíz del proyecto, crea un archivo ecosystem.config.js para configurar PM2:

1
module.exports = {
2
apps: [
3
{
4
name: "my-nestjs-project",
5
script: "dist/main.js",
6
env: {
7
NODE_ENV: "development",
8
},
9
env_production: {
10
NODE_ENV: "production",
11
},
12
},
13
],
14
};

Construir el Proyecto

Antes de iniciar el proyecto, necesitas construirlo:

Terminal window
1
npm run build

Usar PM2 para Iniciar el Proyecto

Usa el siguiente comando para iniciar el proyecto:

Terminal window
1
pm2 start ecosystem.config.js --env production

Este comando iniciará el proyecto NestJS en el entorno de producción según la configuración en ecosystem.config.js.

Conclusión

Este artículo explica detalladamente cómo diferenciar entre entornos de desarrollo y producción y su configuración, incluyendo el uso de variables de entorno, la configuración de conexiones de base de datos diferentes, la carga de archivos de configuración diferentes y cómo usar PM2 para desplegar proyectos NestJS en producción. Al diferenciar y configurar correctamente los diferentes entornos, se puede gestionar y mantener mejor el proyecto, mejorando la eficiencia de desarrollo y despliegue.