在Node.Js / Express应用程序中存储数据库configuration的最佳方法
将数据库configuration(用户名,密码)存储在运行在node.js / Express上的开源应用程序中的最佳方式是什么? 两个具体问题:
-
例如,我应该把它放在
/lib
文件夹中的一个单独的config.js文件中,而不要将它包含在GitHub公开的主存储库中? -
为了包含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