如何在 Keystone.js 以外的 .js 文件中使用 .env 文件变量?

jug*_*gal 5 javascript keystonejs

我们在我们的一个项目中使用 keystone 框架工作,我试图将 .env 文件变量用于我的 .js 文件之一以连接 http 站点。我使用了 dotenv 并调用了 process.env.xxyz,其中 xxyz 是变量我们正在使用。请让我知道是否有任何其他方法可以从 .env 文件中调用变量。

Set*_*day 5

读取process.env是检索环境变量的标准方法。请参阅文档

dotenv您提到的包采用您.env文件中的内容并将其放入process.env. 但是,没有进行验证,因此很容易出错。

相反,试试我的envy模块,它可以防止您可能犯的所有常见错误。它检查缺失的变量等。

如果.env文件仍然给您带来麻烦:

  • 确保使用正确的变量名称。
  • 确保没有错别字。
  • 确保您使用正确的语法。
  • 考虑改用命令行参数。我为此推荐。另请参阅同时使用envy 和 meow的示例。

关于语法:根据您使用的加载器(例如dotenvvs envy),.env文件中的语法可能对其解析方式产生很大影响。例如,在Bash和其他 shell(文件所基于的)中,以下每个示例的行为都完全不同......

MY_VAR=foo $BAR
MY_VAR='foo $BAR'
MY_VAR="foo $BAR"
Run Code Online (Sandbox Code Playgroud)

此外,环境变量名称区分大小写,并且按照惯例都是大写的。这可能会导致在不常见的语言中出现错误。在 Node.js 程序阅读中process.env,有时您可能会忘记环境变量的命名约定与程序的其余部分不同。

const myVar = process.env.myVar;   // wrong
const myVar = process.env.MY_VAR;  // correct
Run Code Online (Sandbox Code Playgroud)

如果您使用envy,大小写不是问题,因为它通过在返回变量名称之前将变量名称规范化为驼峰式大小写来解决此问题。

const { myVar } = envy();  // correct, no matter how it is in `.env`
Run Code Online (Sandbox Code Playgroud)

无论您使用哪种加载器,您当然都需要.env在读取文件之前调用它的加载函数。这几乎不可能忘记,envy()因为您使用它的直接返回值。但是,如果您正在使用dotenv,您可以轻松地process.env在错误的时间访问,因为在调用 之前它已经可用并已填充(但不是所有所需的属性)dotenv.config()

另一个有助于调试并节省时间和精力的技巧是制作专用模块进行配置。多亏了require 缓存,我们避免了多次执行工作,也避免依赖加载器是幂等的

把它放在一个名为env.js.

const envy = require('envy');
module.exports = envy();
Run Code Online (Sandbox Code Playgroud)

然后将其导入其他地方。

const env = require('./env');
Run Code Online (Sandbox Code Playgroud)

现在您有一些非常简单的调试方法,无论您将其导入何处,它都应该能够正常工作。