在Node.Js / Express应用程序中存储数据库configuration的最佳方法

将数据库configuration(用户名,密码)存储在运行在node.js / Express上的开源应用程序中的最佳方式是什么? 两个具体问题:

  1. 例如,我应该把它放在/lib文件夹中的一个单独的config.js文件中,而不要将它包含在GitHub公开的主存储库中?

  2. 为了包含configuration,是否需要它的文件就像require('./config.js')一样简单,还是有更好的方法呢?

PS不好意思,如果问题看起来有点简单,或者不是很好的公式,但我只是开始:)

不知道这是否是最佳做法,但个人我有一个config.json文件,我存储我的数据库连接信息。 然后我执行以下操作:

 // options.js var fs = require('fs'), configPath = './config.json'; var parsed = JSON.parse(fs.readFileSync(configPath, 'UTF-8')); exports.storageConfig= parsed; 

然后从一个不同的文件,我做了以下几点:

 var options = require('./options'); var loginData = { host: options.storageConfig.HOST, user: options.storageConfig.user, password: options.storageConfig.password }; 

以下是我如何做到的:

创build一个包含表示你的configuration的对象的config.js:

 var config = { development: { //url to be used in link generation url: 'http://my.site.com', //mongodb connection settings database: { host: '127.0.0.1', port: '27017', db: 'site_dev' }, //server details server: { host: '127.0.0.1', port: '3422' } }, production: { //url to be used in link generation url: 'http://my.site.com', //mongodb connection settings database: { host: '127.0.0.1', port: '27017', db: 'site' }, //server details server: { host: '127.0.0.1', port: '3421' } } }; module.exports = config; 

然后在我的index.js(或任何地方),

 var env = process.env.NODE_ENV || 'development'; var config = require('./config')[env]; 

然后处理该对象,例如

 var server = express(); server.listen(config.server.port); ... 

我确实投入了参数。 就像这么多node.js例子的端口一样。 你最有可能永远,pm2,nodemon来运行你的应用程序。 所以这个variables不会作为源代码的一部分进行检查。 而且它们也是全球可用的。

 process.env.PORT process.env.DATABASE_USER process.env.DATABASE_PASSWORD PORT=3000 DATABASE_HOST=localhost DATABASE_USER=admin DATABASE_PASSWORD=mypassword node app.js export PORT=3000 export DATABASE_HOST=localhost export DATABASE_PORT=27017 export DATABASE_USER=admin export DATABASE_PASSWORD=mypassword node app.js var server = app.listen(process.env.PORT, function() { }); var mongoClient = new MongoClient(new Server(process.env.DATABASE_HOST, process.env.DATABASE_PORT)); 

为了在需要隐藏数据库证书的地方运行玩具应用,我使用了dotenv模块 。

将你的敏感信息放在一个.env文件(这是.gitignored),放置require('dotenv').config(); 在你的应用程序; dotenv在process.env中创build可以引用的条目。

.env文件:

 DATABASE_PASSWORD=mypw DATABASE_NAME=some_db 

要引用的值:

 process.env.DATABASE_PASSWORD 

为了包含configuration,是否需要它的文件就像require('./ config.js')一样简单,还是有更好的方法呢?

这是存储configuration文件的正确方法。

最好的方法是像普通的node.js模块一样编写整个应用程序,然后编写一个调用它的小型启动文件。 这个想法也允许你使用dependency injection来使用不同的数据库驱动。

好,但不完美的解决scheme是环境。 它在所有的应用程序之间共享,所以如果你有一定的数据你想要所有的人都可以使用,这是最好的select。 但是,如果你有一个特定的应用程序的configuration,并不多。

PS:而且请不要使用JSON。 这是最糟糕的主意。 🙂

我发现这是一个很好的方式来处理我的configuration,考虑到不同的环境:

config.coffee

 exports.setEnvironment = (env) -> switch env when "development" exports.DEBUG_LOG = true exports.DB_PORT = '27017' # ... when "testing" exports.DEBUG_ERROR = true exports.DEBUG_CLIENT = true # ... when "production" exports.DEBUG_LOG = false # ... else console.log "environment #{env} not found" 

server.coffee:

 config = require('./config') config.setEnvironment env