在运行在node.js / Express上的开源应用程序中存储数据库配置(用户名,密码)的最佳方法是什么?两个具体问题:
例如,我是否应该将其放入文件
/lib
夹中的单独config.js文件中,并且永远不要将其包含在GitHub上公开可用的主存储库中?要包括配置,它是否像
require('./config.js')
需要它的文件一样简单,或者有更好的方法呢?
PS很抱歉,如果问题看起来有点简单或表达方式不够好,但我才刚刚开始:)
Answers:
不确定这是否是最佳做法,但就我个人而言,我有一个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
};
这是我的方法:
创建一个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节点上运行您的应用程序。因此此变量不会作为源代码的一部分检入。而且它们也在全球范围内可用。
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));
export PORT=3306
要包含该配置,它是否像需要它的文件中的require('./ config.js')一样简单,还是有更好的方法呢?
这是存储配置文件的正确方法。
最好的方法是像普通的node.js模块一样编写整个应用程序,并编写一个小的启动文件来调用它。这个想法还允许您使用依赖注入来使用不同的数据库驱动程序。
好的,但不是完美的解决方案是环境。它在所有应用程序之间共享,因此,如果您要对所有应用程序使用某些数据,这是最好的选择。但是,如果您有一个特定应用程序的配置,则不是很多。
PS:而且请不要为此使用JSON。这是最糟糕的主意。:)
考虑到不同的环境,我发现这是一种处理配置的好方法:
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
Error: ENOENT, no such file or directory './config.json'
。该解决方案为我工作,当我改变了configPath = './config.json'
对configPath = __dirname + '/config.json'
在options.js
。见@ loganfsmyth的评论在这里:stackoverflow.com/questions/13541948/...