【发布时间】:2017-05-20 22:33:09
【问题描述】:
我们在我们的一个项目中使用 keystone 框架工作,我正在尝试将 .env 文件变量用于我的一个 .js 文件以连接 http 站点。我使用了 dotenv 并调用了 process.env.xxyz,其中 xxyz是我们正在使用的变量。如果有任何其他方法可以从 .env 文件中调用变量,请告诉我。
【问题讨论】:
标签: javascript keystonejs
我们在我们的一个项目中使用 keystone 框架工作,我正在尝试将 .env 文件变量用于我的一个 .js 文件以连接 http 站点。我使用了 dotenv 并调用了 process.env.xxyz,其中 xxyz是我们正在使用的变量。如果有任何其他方法可以从 .env 文件中调用变量,请告诉我。
【问题讨论】:
标签: javascript keystonejs
读取process.env 是检索环境变量的标准方法。见the docs。
您提到的dotenv 包将您的.env 文件中的内容放入process.env。但是没有进行验证,所以很容易出错。
相反,试试我的envy 模块,它可以防止您可能犯的所有常见错误。它会检查缺失的变量等。
如果.env 文件仍然给您带来麻烦:
关于语法:取决于您使用的加载程序(例如 dotenv 与 envy),.env 文件中的语法可能会对它的解析方式产生很大影响。例如,在 Bash 和其他 shell(文件所基于)中,以下每个示例的行为都完全不同...
MY_VAR=foo $BAR
MY_VAR='foo $BAR'
MY_VAR="foo $BAR"
此外,环境变量名称区分大小写,并且按照惯例都是大写的。这可能会导致不常见的语言错误。在读取 process.env 的 Node.js 程序中,有时您可能会忘记环境变量的命名约定与程序的其余部分不同。
const myVar = process.env.myVar; // wrong
const myVar = process.env.MY_VAR; // correct
如果您使用 envy,大小写不是问题,因为它通过在返回变量名称之前将变量名称标准化为驼峰式来解决此问题。
const { myVar } = envy(); // correct, no matter how it is in `.env`
无论您使用哪个加载器,您当然需要在读取.env 文件之前调用它的加载函数。使用envy() 几乎不可能忘记这一点,因为您仅 使用它的直接返回值。但是,如果您使用的是dotenv,您可以在错误的时间轻松访问process.env,因为在调用dotenv.config() 之前它已经可用并已填充(但不是所有所需的属性)。
另一个有助于调试并节省时间和精力的技巧是制作一个专用模块进行配置。感谢require cache,我们避免了多次执行这项工作,也避免了依赖加载程序为idempotent。
把它放在一个名为env.js的文件中。
const envy = require('envy');
module.exports = envy();
然后将其导入其他地方。
const env = require('./env');
现在您有了非常简单的调试工具,无论您在何处导入它,它都应该可以正常工作。
【讨论】:
只需将 xxyz=HTTPSiteAddress 添加到您的 .env 文件中。然后,您可以使用 process.env.xxyz 在任何地方调用该变量。
例如:
var request = require("request");
request(process.env.xxyz, function(error, response, body) {
console.log(body);
});
只要您的 keystone.js 文件包含在顶部,这将起作用:
require('dotenv').config();
【讨论】: