Лучший способ сохранить конфигурацию БД в Node.Js/Express app
Каким будет лучший способ сохранить конфигурацию DB (имя пользователя, пароль) в приложении с открытым исходным кодом, которое работает на node.js/Express? Два конкретных вопроса:
-
Должен ли я помещать его в отдельный файл config.js в папку /lib
, например, и никогда не включать его в основной репозиторий, который общедоступен в GitHub?
-
Чтобы включить конфигурацию, это так же просто, как require('./config.js')
из файла, который ему нужен, или есть лучший способ сделать это?
PS извините, если вопросы кажутся немного простыми или не так хорошо сформулированными, но я только начинаю:)
Ответы
Ответ 1
Не уверен, что это лучшая практика, но лично у меня есть файл config.json
, где я храню информацию о подключении к db. Затем я делаю следующее:
// 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
};
Ответ 2
Вот как я это делаю:
Создайте 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);
...
Ответ 3
Я помещаю в args. так же, как порт из-за большого количества примеров node.js.
вы, скорее всего, навсегда, pm2, nodemon для запуска вашего приложения. поэтому эта переменная не проверяется как часть вашего исходного кода. и они также доступны по всему миру.
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));
Ответ 4
Для запуска игрушечных приложений, где мне нужно скрыть учетные данные db, я использую модуль dotenv.
Поместите свою конфиденциальную информацию в .ENV файл (который является .gitignored), поместите require('dotenv').config();
в ваше приложение; dotenv создает записи в process.env
, к которым вы можете обратиться.
.env
файл:
DATABASE_PASSWORD=mypw
DATABASE_NAME=some_db
Для обозначения значений:
process.env.DATABASE_PASSWORD
Ответ 5
Чтобы включить конфигурацию, это так же просто, как require ('./config.js') из файла, который ему нужен, или есть лучший способ сделать это?
Это правильный способ хранения файлов конфигурации.
Лучшим подходом было бы написать все ваше приложение, как обычный node.js модуль, и написать небольшой загрузочный файл, который его вызывает. Эта идея также позволяет использовать разные драйверы базы данных, используя инъекцию зависимостей.
Хорошее, но не идеальное решение - это окружающая среда. Он распределяется между всеми приложениями, поэтому, если у вас есть определенные данные, которые вы хотите использовать для всех из них, это лучший выбор. Но если у вас есть конфиг для одного конкретного приложения, это не так.
PS: И, пожалуйста, не используйте JSON для этого. Это наихудшая идея.:)
Ответ 6
Я нашел этот хороший способ справиться с моей конфигурацией, рассматривая разные среды:
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