提问者:小点点

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


我正在开发我的第一个NestJS应用程序,该应用程序在app.module.ts中使用硬编码的数据库连接字符串时运行良好。

但是根据我们的要求,我必须从环境文件中选择数据库配置值。 为此,我遵循了nestjs文档网站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],
})

现在,我想从。env文件中选取这些DB值,这些文件如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],
})

共2个答案

匿名用户

1.使用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` });

2.使用env-cmd

您可以使用env-cmdnpm包。

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

匿名用户

您需要使用mongoosemodule.forRootAsync(()=>{。。。})而不是mongoosemodule.forRoot(...)

这使得MongooseModule等待它的IOC依赖项。

请参阅:https://docs.nestjs.com/techniques/MongoDB#async-configuration