我正在开发我的第一个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.env
,dev.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],
})
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-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
您需要使用mongoosemodule.forRootAsync(()=>{。。。})
而不是mongoosemodule.forRoot(...)
这使得MongooseModule等待它的IOC依赖项。
请参阅:https://docs.nestjs.com/techniques/MongoDB#async-configuration