Nest JS - Как использовать переменные .env в основном файле модуля приложения для подключения к базе данных - PullRequest
1 голос
/ 06 августа 2020

Я работаю над своим первым приложением Nest JS, которое отлично работало с жестко запрограммированной строкой подключения к базе данных в app.module.ts.

Но затем в соответствии с нашими требованиями мне пришлось выбрать значения конфигурации базы данных из файлов среды. Для этого я следовал документации конфигурации на веб-сайте документации nest js - https://docs.nestjs.com/techniques/configuration

Но проблема в том, что мне нужно использовать переменные .env внутри того же файла для соединение с базой данных, которое не работает.

Вот мой исходный код, который работал нормально:

@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],
})

Теперь я хотел выбрать те значения DB из файлов .env, которые похожи на local.env, dev.env и c. в зависимости от окружающей среды. Теперь мой этот код не работает:

@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],
})

Ответы [ 2 ]

4 голосов
/ 06 августа 2020

Вам необходимо использовать MongooseModule.forRootAsync(() => {...}) вместо MongooseModule.forRoot(...)

Это заставляет MongooseModule ждать своих зависимостей ввода-вывода C.

См .: https://docs.nestjs.com/techniques/mongodb#async -конфигурация

1 голос
/ 06 августа 2020

1. Используя dotenv

npm install dotenv

Добавьте несколько скриптов в свой package.json, чтобы указать, в каком env вы находитесь.

"scripts": {
  ...
  "start:local": "NODE_ENV=local npm run start"
  "start:dev": "NODE_ENV=dev npm run start"
}

Импортируйте dotenv в main.ts файл . Убедитесь, что вы делаете это в верхней части файла.

require('dotenv').config({ path: `../${process.env.NODE_ENV}.env` });

2. Используя env-cmd

Вы можете использовать env-cmd npm package.

npm install env-cmd

И добавить несколько команд для разных env в package.json, например:

"scripts": {
  ...
  "start:local": "env-cmd -f local.env npm run start"
  "start:dev": "env-cmd -f dev.env npm run start"
}
...

Теперь вы можете использовать переменные 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' })

process.env.MONGO_CONNECTION_STRING

...