NodeJS NestJS -如何在主应用程序模块文件中使用.env变量进行数据库连接

r6vfmomb  于 12个月前  发布在  Node.js
关注(0)|答案(7)|浏览(110)

我正在开发我的第一个NestJS应用程序,它可以很好地使用app.module.ts中的硬编码数据库连接字符串。
但是根据我们的要求,我必须从环境文件中选择数据库配置值。为此,我遵循了nestjs文档网站https://docs.nestjs.com/techniques/configuration上的配置文档
但问题是,我需要使用同一文件中的.env变量进行数据库连接,这是失败的。
下面是我的原始代码,它工作得很好:

@Module({
  imports: [
    MongooseModule.forRoot(`mongodb+srv://myusername:[email protected]?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' }),
    ProductModule,
    CategoryModule,
  ],
  controllers: [
    AppController,
    HealthCheckController,
  ],
  providers: [AppService, CustomLogger],
})

现在,我想从.env文件中选择那些数据库值,如local.envdev.env等。取决于环境。现在,我的代码不起作用:

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

whlutmcx1#

来自Nestjs文档-https://docs.nestjs.com/techniques/configuration
这些步骤对我使用MySQL和TypeORM很有效。
1.安装Nestjs配置模块-npm i --save @nestjs/config。它依赖于dotenv
1.在根文件夹中创建一个.env文件,并添加键/值对,例如:DATABASE_USER=myusername
1.打开app.module.ts并导入config模块

import { ConfigModule } from '@nestjs/config';

1.在app.module.ts的导入部分添加下面一行。我把它作为第一个输入。它将自动加载.env文件的内容。

ConfigModule.forRoot(),

1.然后你就可以开始按照数据库配置部分中常用的process. env来使用env变量<variable_name>了。

process.env.DATABASE_USER

有关ConfigModule的更多配置,请参阅上面的链接。您可以使用自定义文件/路径并将模块设置为全局可见。

6ovsh4lw

6ovsh4lw2#

1.继续使用ConfigModule

您需要在npm脚本中设置NODE_ENV,以便它可以用于基于env加载env文件。

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

现在你可以使用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.使用dotenv

npm install dotenv

在你的package.json中添加一些脚本来设置你所在的环境。

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

main.ts文件中导入dotenv。确保你在文件的顶部这样做。

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

3.使用env-cmd

你可以使用env-cmd npm包。

npm install env-cmd

并为package.json中的不同env添加一些命令,例如:

"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

更新:

要克服env set命令在不同平台下的问题,可以安装cross-env包。

npm install -D cross-env

并更新脚本:

"scripts": {
  "start:local": "cross-env NODE_ENV=local npm run start"
  "start:dev": "cross-env NODE_ENV=dev npm run start"
}
qlckcl4x

qlckcl4x3#

MongooseModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    uri: configService.get<string>('MONGODB_URI'),
  }),
  inject: [ConfigService],
});
6mzjoqzu

6mzjoqzu4#

使用nestjs/config包:
npm install @nestjs/config
安装软件包后,在app模块(app.module.ts文件)中:

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [ConfigModule.forRoot()],
})

export class AppModule {}

之后,.env文件可以在整个应用程序中访问。假设你的.env文件看起来像这样。

DB_USER=mohit

要访问DB_USER变量,请使用process.env.DB_USER

envsm3lx

envsm3lx5#

您需要使用MongooseModule.forRootAsync(() => {...})而不是MongooseModule.forRoot(...)
这使得MongooseModule等待其IOC依赖项。
参见:https://docs.nestjs.com/techniques/mongodb#async-configuration

yrefmtwq

yrefmtwq6#

要在app.module.ts本身中使用NestJS配置(dot-env),请使用MongooseModule.forRootAsync({})。这是我的代码。

@Module({
  imports: [
    MongooseModule.forRootAsync({
      useFactory: () => ({
        uri: process.env.CONNECTION_STRING,
      }),
    }),
    ConfigModule.forRoot(
      {
        isGlobal: true
      }
    )
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule { }
kr98yfug

kr98yfug7#

MongooseModule.forRootAsync({
  useFactory: () => ({
    uri: process.env.DB_CONNECTION
  }),
}),
ConfigModule.forRoot({isGlobal: true,}),

相关问题