为什么我不应该在生产模式下使用 dotenv?

Why i should not use dotenv in production mode?

为什么我不应该在生产模式下使用 dotenv?

我在一些网站上看到了下面的代码。但是我不明白他们为什么要进行这种条件检查。

if (process.env.NODE_ENV !== 'production') {
  require('dotenv').config();
}
console.log('Bla is :', process.env.Bla);(*)

假设在非生产模式中行(*)的输出是-> Bla 是:Bla

如果 NODE_ENV 是生产,行 (*) 的输出是什么? (据我所知,我认为它将是 undefined

这背后的想法是 dotenv 通常在开发人员工作站上使用。这是一种使用平面文件(通常命名为“.env”)覆盖环境文件的方法。您不在生产中使用它的原因是,在生产中,您通常 运行 应用程序在 docker 容器或专用服务器中,您无需担心设置冲突的环境变量.

为了回答实际问题,在这种情况下,该行的输出将是本地环境变量设置的值。如果未设置,它将只是 undefined.

在此示例中,它是开发人员的偏好。没有什么可以阻止您使用它,但在生产中您可能已经设置了所有需要的环境变量。

在这里,他们在测试和开发期间使用 dotenv。这允许开发人员在编写应用程序时在 .env 文件中定义环境变量,这有助于防止在错误的数据库上工作。

所以这样想:

When developing or testing the code, use the test keys, otherwise, use the keys provided by the environment

如果环境变量 Bla 没有在 运行 Node 之前设置,那么它将是 undefined,但它可能被配置为此代码的任何生产值需要电子邮件或 API 密钥。

作为对其他答案的补充,您还会产生安全问题。您将对数据库连接、令牌和密码等信息进行版本控制(提交 git)。在这种情况下,访问代码的每个人都能够连接到生产资源。

为了解决这个问题,在生产环境中,您直接在您是 运行 代码的实例上创建环境变量。

因为在生产中,您可能希望将环境变量直接设置到虚拟机中,因为您可能没有 ssh 访问权限并且无法将 .env 文件推送到版本控制。在我的例子中,我使用的是 heroku 免费套餐,我无法通过 ssh 创建 .env 文件。所以我在 Config Vars 设置中手动设置了我的环境变量。