Estoy trabajando en mi primera aplicación NestJS, que funcionaba bien con la cadena de conexión de la base de datos codificada en app.module.ts .
Pero luego, según nuestros requisitos, tuve que elegir los valores de configuración de la base de datos de los archivos de entorno. Para eso, seguí la documentación de configuración en el sitio web de documentación de nestjs: https://docs.nestjs.com/techniques/configuration
Pero el problema es que necesito usar las variables .env dentro del mismo archivo para la conexión a la base de datos, lo cual está fallando.
Aquí está mi código original que funcionaba bien:
@Module({ imports: [ MongooseModule.forRoot(`mongodb+srv://myusername:mypassword@myhost.net?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' }), ProductModule, CategoryModule, ], controllers: [ AppController, HealthCheckController, ], providers: [AppService, CustomLogger], }) Ahora, quería elegir esos valores DB de los archivos .env que son como local.env , dev.env , etc., según el entorno. Ahora, mi este código no funciona:
@Module({ imports: [ ConfigModule.forRoot({ envFilePath: `${process.env.NODE_ENV}.env` }), MongooseModule.forRoot(`mongodb+srv://${ConfigModule.get('DB_USER')}:${ConfigModule.get('DB_PASS')}@myhost.net?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' }), ProductModule, CategoryModule, ], controllers: [ AppController, HealthCheckController, ], providers: [AppService, CustomLogger], })MongooseModule.forRootAsync({ imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ uri: configService.get<string>('MONGODB_URI'), }), inject: [ConfigService], });De los documentos de Nestjs aquí: https://docs.nestjs.com/techniques/configuration
Estos pasos me funcionaron con MySQL y TypeORM.
Instale el módulo de configuración de Nestjs - npm i --save @nestjs/config . Se basa en dotenv
Cree un archivo .env en su carpeta raíz y agregue sus pares clave/valor, por ejemplo, DATABASE_USER=myusername
Abra app.module.ts e importe el módulo de configuración
import { ConfigModule } from '@nestjs/config';app.module.ts . Lo agregué en la primera importación. Cargará el contenido del archivo .env automáticamente. ConfigModule.forRoot(), process.env.DATABASE_USERPara obtener más información sobre la configuración de ConfigModule, consulte el enlace anterior. Puede usar un archivo/ruta personalizado y configurar el módulo visible globalmente.
Debe usar MongooseModule.forRootAsync(() => {...}) en lugar de MongooseModule.forRoot(...)
Esto hace que MongooseModule espere sus dependencias IOC.
Ver: https://docs.nestjs.com/techniques/mongodb#async-configuration
1. Seguir usando ConfigModule
Debe configurar NODE_ENV en los scripts npm para que pueda usarse para cargar un archivo env basado en el env.
"scripts": { "start:local": "NODE_ENV=local npm run start" "start:dev": "NODE_ENV=dev npm run start" } Ahora solo puede usar ConfigModule :
@Module({ imports: [ ConfigModule.forRoot({ envFilePath: `${process.env.NODE_ENV}.env` }), MongooseModule.forRoot(`mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@myhost.net?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' }) ... }) 2. Usando dotenv
npm install dotenv Agregue algunos scripts a su package.json para establecer en qué entorno se encuentra.
"scripts": { ... "start:local": "NODE_ENV=local npm run start" "start:dev": "NODE_ENV=dev npm run start" } Importe dotenv en el archivo main.ts Asegúrate de hacerlo en la parte superior del archivo.
require('dotenv').config({ path: `../${process.env.NODE_ENV}.env` }); 3. Usando env-cmd
Puede usar el paquete env-cmd npm.
npm install env-cmd Y agregue algunos comandos para diferentes envs en package.json , por ejemplo:
"scripts": { ... "start:local": "env-cmd -f local.env npm run start" "start:dev": "env-cmd -f dev.env npm run start" } ...Ahora puede usar las variables env, por ejemplo:
MongooseModule.forRoot(`mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@myhost.net?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' }) process.env.MONGO_CONNECTION_STRING
Usando el paquete nestjs/config:
npm instalar @nestjs/config
Después de instalar el paquete, en el módulo de la aplicación (archivo app.module.ts):
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ConfigModule.forRoot()], }) export class AppModule {}Después de eso, se puede acceder a los archivos .env en toda la aplicación. Suponga que su archivo .env se ve así.
DB_USER=mohitpara acceder a la variable DB_USER utilice process.env.DB_USER