【问题标题】:nestjs configuration with dotenv使用 dotenv 的 nestjs 配置
【发布时间】:2021-04-14 02:20:37
【问题描述】:

参考official NestJS documentation,建议使用ConfigService,以便使用环境变量。

所以在代码中,我们访问.env 文件中定义的所有变量,例如:

config.get('PORT')

但不建议在生产环境中使用.env。那么如何部署呢?

为什么不使用dotenvprocess.env.PORT 的标准方法?

【问题讨论】:

  • 不建议commit .env 文件,不要使用它。基本上,您的 env 文件将保存您的秘密,因此例如密码不会在您的 VCS 中提交。

标签: configuration nestjs


【解决方案1】:

有两个问题使ConfigService 不太有用。

第一

当任何环境中都没有.env文件时,readFileSync in

dotenv.parse(fs.readFileSync(filePath))

会失败:

[Nest] 63403 [ExceptionHandler] path must be a string or Buffer
TypeError: path must be a string or Buffer
    at Object.fs.openSync (fs.js:646:18)
    at Object.fs.readFileSync (fs.js:551:33)
    at new ConfigService (../config/config.service.ts:8:38)

即使例如process.env.API_KEY 可用

this.configService.get('API_KEY')

不会返回任何东西。所以ConfigService 强制你使用prod.env 文件,这是dotenv 反对的:

没有。我们强烈建议不要使用“主” .env 文件和 “环境” .env 文件,如 .env.test。您的配置应该有所不同 在部署之间,您不应该在之间共享值 环境。

https://github.com/motdotla/dotenv#should-i-have-multiple-env-files

第二

您必须导入配置模块并注入服务才能使用它。当你使用这样的环境变量时

imports: [
  MongooseModule.forRoot(process.env.MONGO_URI, { useNewUrlParser: true }),
  ConfigModule,
],

配置服务没用。

在此处阅读有关环境中配置的更多信息:https://12factor.net/config

【讨论】:

  • 我才刚刚意识到,nest 期望我们如何在真实的生产环境中使用配置服务?即说 env 是通过 docker、bash 等注入的?
  • 如果有人在乎的话,我刚刚将if (process.env[key]) { return process.env[key]; } return this.envConfig[key]; ...添加到我的 config.service.ts 中,令人惊讶的是,它似乎工作正常
  • nestjs 以某种方式构建,不会将 .env 文件复制到 dist 文件夹,因此我不断收到文件未找到错误
【解决方案2】:

但不建议在生产环境中使用 .env。那么如何部署呢?

实际上,不建议提交您的 .env 文件。在生产中使用它们非常好:-)。

为什么不使用带有 dotenv 和 process.env.PORT 的标准方法?

它允许您的核心代码与负责提供配置数据的代码解耦。因此:

  • 核心代码更容易测试:对process.env进行一些手动更改/模拟是这样 - a - 痛苦,而模拟“ConfigService”非常简单
  • 您可以想象将来使用环境变量以外的任何东西,只需替换专用类中的单个方法(或几个 getter),而不是替换代码中所有出现的process.env.* // 公平地说,这不太可能发生,因为使用 env。 variables 是加载配置数据的最常用方法,但仍然如此。

【讨论】:

    【解决方案3】:

    使用@nestjs/config(又名ConfigModule)可以让您的应用使用环境变量,无论它们来自.env 文件还是在环境中设置。在本地使用 .env 文件,在生产环境中使用环境。

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2020-01-30
      • 2021-08-05
      • 2021-11-08
      • 2017-12-16
      • 2021-05-24
      • 2019-06-19
      • 2019-09-18
      • 2020-05-11
      相关资源
      最近更新 更多