NestJS - 如何在主应用程序模块文件中使用 .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 文件中选择那些数据库值,例如 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],
})

原文由 Mohit Bhardwaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 562
2 个回答

1.继续使用ConfigModule

你需要在 npm scripts 中设置 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 添加一些针对不同环境的命令,例如:

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


现在您可以使用环境变量,例如:

 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"
}

原文由 Miracle 发布,翻译遵循 CC BY-SA 4.0 许可协议

从这里的 Nestjs 文档 - https://docs.nestjs.com/techniques/configuration

这些步骤对我适用于 MySQL 和 TypeORM。

  1. 安装 Nestjs 配置模块 - npm i --save @nestjs/config 。它依赖于dotenv

  2. 在您的根文件夹中创建一个 .env 文件并添加您的键/值对,例如 DATABASE_USER=myusername

  3. 打开 app.module.ts 并导入配置模块

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

  1. 将以下行添加到 app.module.ts 的导入部分。我将它添加为第一次导入。它会自动加载 .env 文件的内容。
     ConfigModule.forRoot(),

  1. 然后,您可以按照数据库配置部分中的常规 process.env. 开始使用环境变量,例如
    process.env.DATABASE_USER

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

原文由 swedge218 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题