我应该在哪里存储节点服务器上的密钥?

Rod*_*tou 12 node.js

好吧,我遇到了一个问题.如何存储密码,数据库URL和不应该进入我的公共版本控制的重要字符串?

我想出了3个解决方案.第一个只适用于dev:

var config = require('./config');
var port = config.serverPort;
Run Code Online (Sandbox Code Playgroud)

config.js

module.exports = {
  'serverPort' : '8182'
}
Run Code Online (Sandbox Code Playgroud)

第二个应该在开发和生产线的工作都.但config.js文件已添加到.gitignore文件中,因此不会上传到服务器.当服务器尝试要求config.js并且找不到它时,它将引发错误.

var config = require('./config');
var port = process.env.PORT || config.serverPort;
Run Code Online (Sandbox Code Playgroud)

第三个是只使用process.env变量,但这只适用于生产.而且,如果我在本地机器上测试,我可能需要粘贴我的秘密字符串并记得在发送到公共版本控件之前将其删除.

所以我该怎么做?

Thi*_*ter 13

常见的解决方案是将config.js.example文件添加到版本控制(包含空/虚拟值以记录可用的内容).

然后你添加config.js到.gitignore(或任何适合你的VCS).

要运行程序,你简单地复制config.js.exampleconfig.js并放在正确的价值观.

当然,config.js可以从环境变量中获取路径以允许轻松使用不同的配置 - 但是,您仍然不会将实际的配置文件置于版本控制之下(除非您有一个单独的私有仓库用于配置文件等)

总是要求配置文件存在才有意义.即使在开发中.虽然默认设置可能是合适的,但是您的应用程序上的许多开发人员仍然希望无论如何都要配置内容,或者只是使用非默认值测试内容.


Chr*_*idi 5

dotenv包可用于将配置和机密从.env文件加载到process.env. 对于生产,该.env文件不必存在。

例子:

require('dotenv').config();

const oauth2 = require('simple-oauth2').create({
  client: {
    id: process.env.TWITTER_CONSUMER_KEY,
    secret: process.env.TWITTER_CONSUMER_SECRET
  }
});
Run Code Online (Sandbox Code Playgroud)

.env 文件:

TWITTER_CONSUMER_KEY=bMm...
TWITTER_CONSUMER_SECRET=jQ39...
Run Code Online (Sandbox Code Playgroud)

.gitignore:

.env
Run Code Online (Sandbox Code Playgroud)