在Node.js中使用API​​密钥时的最佳实践

Dra*_*ain 27 api-key node.js

我有一个我在Node.js应用程序中使用的API密钥.目前,我将它保存在一个文本文件中,并在我的应用程序启动时将其放在一个全局变量中.

Sooo基本上只是:

var key = getKey();
useKeyGetData(key);
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个全局变量,在文件之间传递是一件痛苦的事.有没有更好的方法来获取我的钥匙在何时/何时需要它?这样做有一些标准吗?

Jor*_*eña 48

您正在做的事情的常规替代方案,尤其是与API密钥相关时,是使用环境变量.这是一个操作系统级配置工具.每个进程都有自己的一组环境变量,通常从其父进程继承.按照惯例,环境变量具有大写名称.

在node.js中,您可以通过访问环境变量process.env.例如,如果您运行这样的应用程序:

$ MY_VARIABLE=test node app.js
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式访问MY_VARIABLE环境变量的值:

process.env.MY_VARIABLE
Run Code Online (Sandbox Code Playgroud)

但是,在每次调用程序时必须继续传递环境变量,这可能很乏味.这就是为什么像dotenv这样的软件包允许您将环境变量存储在文本文件中的原因.

更具体地说,您将拥有一个名为的文件.env,您可能拥有:

MY_VARIABLE=test
OTHER_VARIABLE=foo
Run Code Online (Sandbox Code Playgroud)

在你的开始app.js,你做:

require('dotenv').config();
Run Code Online (Sandbox Code Playgroud)

这将从.env文件中读取环境变量值.然后,您可以像访问任何其他环境变量一样访问它们:

console.log("MY_VARIABLE: " + process.env.MY_VARIABLE);
console.log("OTHER_VARIABLE: " + process.env.OTHER_VARIABLE);
Run Code Online (Sandbox Code Playgroud)

现在,您不必在调用时将环境变量显式传递给应用程序,即您可以像往常一样运行它:

$ node app.js
Run Code Online (Sandbox Code Playgroud)

如果你明确地传递一个,它将覆盖你在给了任何价值.env的文件:

$ MY_VARIABLE=bar node app.js
Run Code Online (Sandbox Code Playgroud)

现在MY_VARIABLE环境变量将具有值"bar"而不是"testing".由于OTHER_VARIABLE未显式传递,因此它将保留其"foo".env文件中指定的值.

  • 这非常好,尽管仍然值得注意的是另一个最佳实践是将 .env 文件包含在您的 .gitignore 中,因此由于安全原因它不会向整个公众显示。 (3认同)
  • 例如,假设您要生成服务器进程的多个实例,每个实例都绑定到不同的端口.如果使用constants.json文件,则必须实现对每个进程或其他东西具有单独的constants.json文件的支持.使用env vars,这是很自然的,你只需使用不同的env var生成多个实例:`$ PORT = 3000 myprocess`,`$ PORT = 3001 myprocess`等.在生产中你通常在流程管理器中指定这些env vars你使用像systemd,upstart,docker或包装器脚本. (2认同)
  • 另一个好处是,这是一个操作系统级别的机制.您的进程的任何部分都可以访问这些环境变量,即使您的进程生成的子进程默认也会继承这些变量; 他们不必每个人都必须实现对读取自定义配置文件的支持,他们只需读取环境变量,无论他们编写什么语言. (2认同)
  • 最后,它们不是灵丹妙药.这不是一个全有或全无的情况.对于更一般的设置,您可能还有一个配置文件(可能更有意义),您可以检查env vars以查看它们是否应该基于每个进程覆盖某些设置,或者您可以完全放弃env变量.这取决于你,它只是另一种做事方式. (2认同)