Node.js настраивает специфичные для среды конфиги, которые будут использоваться с EveryAuth
Я использую node.js + express.js + everyauth.js. Я переместил всю свою логику Everyauth в файл модуля
var login = require('./lib/everyauthLogin');
внутри этого я загружаю свой конфигурационный файл oAuth с комбинациями ключ / секрет:
var conf = require('./conf');
.....
twitter: {
consumerKey: 'ABC',
consumerSecret: '123'
}
Эти коды различны для разных сред - разработка / подготовка / производство, так как обратные вызовы для разных URL-адресов.
Королева Как мне установить их в конфигурации среды для фильтрации через все модули или я могу передать путь непосредственно в модуль?
Установить в env:
app.configure('development', function(){
app.set('configPath', './confLocal');
});
app.configure('production', function(){
app.set('configPath', './confProduction');
});
var conf = require(app.get('configPath'));
Пройти в
app.configure('production', function(){
var login = require('./lib/everyauthLogin', {configPath: './confProduction'});
});
? надеюсь, что это имеет смысл
7 ответов
Мое решение,
загрузить приложение, используя
NODE_ENV=production node app.js
Тогда настройте config.js
как функция, а не объект
module.exports = function(){
switch(process.env.NODE_ENV){
case 'development':
return {dev setting};
case 'production':
return {prod settings};
default:
return {error or other settings};
}
};
Затем в соответствии с решением Jans загрузите файл и создайте новый экземпляр, который мы могли бы передать в случае необходимости значение, в этом случае process.env.NODE_ENV
является глобальным, поэтому не нужно.
var Config = require('./conf'),
conf = new Config();
Тогда мы можем получить доступ к свойствам объекта конфигурации точно так же, как и раньше
conf.twitter.consumerKey
Вы также можете иметь файл JSON с NODE_ENV в качестве верхнего уровня. IMO, это лучший способ выразить настройки конфигурации (в отличие от использования скрипта, который возвращает настройки).
var config = require('./env.json')[process.env.NODE_ENV || 'development'];
Пример для env.json:
{
"development": {
"MONGO_URI": "mongodb://localhost/test",
"MONGO_OPTIONS": { "db": { "safe": true } }
},
"production": {
"MONGO_URI": "mongodb://localhost/production",
"MONGO_OPTIONS": { "db": { "safe": true } }
}
}
Очень полезным решением является использование модуля конфигурации.
после установки модуля:
$ npm install config
Вы можете создать файл конфигурации default.json. (вы можете использовать объект JSON или JS, используя расширение.json5)
Например
$ vi config/default.json
{
"name": "My App Name",
"configPath": "/my/default/path",
"port": 3000
}
Эту конфигурацию по умолчанию можно переопределить с помощью файла конфигурации среды или локального файла конфигурации для локальной среды разработки:
production.json может быть:
{
"configPath": "/my/production/path",
"port": 8080
}
development.json может быть:
{
"configPath": "/my/development/path",
"port": 8081
}
На вашем локальном ПК вы можете иметь local.json, который перекрывает всю среду, или вы можете иметь определенную локальную конфигурацию, например local-production.json или local-development.json.
Полный список заказов на загрузку.
Внутри вашего приложения
В вашем приложении вам нужно только указать конфигурацию и необходимый атрибут.
var conf = require('config'); // it loads the right file
var login = require('./lib/everyauthLogin', {configPath: conf.get('configPath'));
Загрузите приложение
загрузить приложение, используя:
NODE_ENV=production node app.js
или установив правильную среду с помощью forever или pm2
Навсегда:
NODE_ENV=production forever [flags] start app.js [app_flags]
PM2 (через оболочку):
export NODE_ENV=staging
pm2 start app.js
PM2 (через.json):
process.json
{
"apps" : [{
"name": "My App",
"script": "worker.js",
"env": {
"NODE_ENV": "development",
},
"env_production" : {
"NODE_ENV": "production"
}
}]
}
А потом
$ pm2 start process.json --env production
Это решение очень простое и позволяет легко устанавливать различные конфигурационные файлы для среды Production/Staging/Development, а также для локальных настроек.
Вкратце
Этот вид установки прост и элегантен:
env.json
{
"development": {
"facebook_app_id": "facebook_dummy_dev_app_id",
"facebook_app_secret": "facebook_dummy_dev_app_secret",
},
"production": {
"facebook_app_id": "facebook_dummy_prod_app_id",
"facebook_app_secret": "facebook_dummy_prod_app_secret",
}
}
common.js
var env = require('env.json');
exports.config = function() {
var node_env = process.env.NODE_ENV || 'development';
return env[node_env];
};
app.js
var common = require('./routes/common')
var config = common.config();
var facebook_app_id = config.facebook_app_id;
// do something with facebook_app_id
Для запуска в производственном режиме: $ NODE_ENV=production node app.js
В деталях
Это решение от: http://himanshu.gilani.info/blog/2012/09/26/bootstraping-a-node-dot-js-app-for-dev-slash-prod-environment/, проверьте его для более детально.
Элегантный способ заключается в использовании .env
файл для локального переопределения производственных настроек. Нет необходимости в переключателях командной строки. Нет необходимости во всех этих запятых и скобках в config.json
файл. Смотрите мой ответ здесь
Пример: на моей машине .env
файл это:
NODE_ENV=dev
TWITTER_AUTH_TOKEN=something-needed-for-api-calls
Мой местный .env
переопределяет любые переменные окружения. Но на промежуточных или производственных серверах (возможно, они находятся на heroku.com) переменные среды предварительно установлены на stage NODE_ENV=stage
или производство NODE_ENV=prod
,
Мы делаем это путем передачи аргумента при запуске приложения со средой. Например:
node app.js -c dev
Затем в app.js загружаем dev.js
как наш файл конфигурации. Вы можете проанализировать эти параметры с помощью optparse-js.
Теперь у вас есть несколько основных модулей, которые зависят от этого файла конфигурации. Когда вы пишете их так:
var Workspace = module.exports = function(config) {
if (config) {
// do something;
}
}
(function () {
this.methodOnWorkspace = function () {
};
}).call(Workspace.prototype);
И вы можете позвонить тогда в app.js
лайк:
var Workspace = require("workspace");
this.workspace = new Workspace(config);
Установить переменную среды на сервере развертывания (например, как NODE_ENV=production). Вы можете получить доступ к своей переменной среды через process.env.NODE_ENV. Найдите следующий файл конфигурации для глобальных настроек
const env = process.env.NODE_ENV || "development"
const configs = {
base: {
env,
host: '0.0.0.0',
port: 3000,
dbPort: 3306,
secret: "secretKey for sessions",
dialect: 'mysql',
issuer : 'Mysoft corp',
subject : 'some@user.com',
},
development: {
port: 3000,
dbUser: 'root',
dbPassword: 'root',
},
smoke: {
port: 3000,
dbUser: 'root',
},
integration: {
port: 3000,
dbUser: 'root',
},
production: {
port: 3000,
dbUser: 'root',
}
};
const config = Object.assign(configs.base, configs[env]);
module.exports= config;
base содержит общий конфиг для всех сред.
затем импортируйте в другие модули, например
const config = require('path/to/config.js')
console.log(config.port)
Удачного кодирования...
Как насчет того, чтобы сделать это гораздо более элегантно с модулем nodejs-config.
Этот модуль может установить конфигурационную среду на основе имени вашего компьютера. После этого при запросе конфигурации вы получите значение для конкретной среды.
Например, предположим, что у вас есть две машины разработки с именами pc1 и pc2 и рабочая машина с именем pc3. Всякий раз, когда вы запрашиваете значения конфигурации в своем коде в pc1 или pc2, вы должны получить конфигурацию среды разработки, а в pc3 вы должны получить конфигурацию среды производства. Это может быть достигнуто следующим образом:
- Создайте файл базовой конфигурации в каталоге config, скажем "app.json" и добавьте в него необходимые конфигурации.
- Теперь просто создайте папки в каталоге config, который соответствует имени вашей среды, в данном случае "разработка" и "производство".
- Затем создайте файлы конфигурации, которые вы хотите переопределить, и укажите параметры для каждой среды в каталогах среды (обратите внимание, что вам не нужно указывать каждый параметр в базовом файле конфигурации, а только те параметры, которые вы хотите переопределить. Конфигурационные файлы среды будут "каскадными" поверх базовых файлов.).
Теперь создайте новый экземпляр конфигурации со следующим синтаксисом.
var config = require('nodejs-config')(
__dirname, // an absolute path to your applications 'config' directory
{
development: ["pc1", "pc2"],
production: ["pc3"],
}
);
Теперь вы можете получить любое значение конфигурации, не беспокоясь о такой среде:
config.get('app').configurationKey;
В этом ответе нет ничего нового. Это похоже на то, что упомянул @andy_t. Но я использую схему ниже по двум причинам.
Чистая реализация без внешних зависимостей npm
Объедините параметры конфигурации по умолчанию с параметрами среды.
Реализация Javascript
const settings = {
_default: {
timeout: 100
baseUrl: "http://some.api/",
},
production: {
baseUrl: "http://some.prod.api/",
},
}
// If you are not using ECMAScript 2018 Standard
// https://stackru.com/a/171256/1251350
module.exports = { ...settings._default, ...settings[process.env.NODE_ENV] }
Я обычно использую машинописный текст в моем проекте узла. Ниже моя фактическая реализация скопирована.
Реализация машинописного текста
const settings: { default: ISettings, production: any } = {
_default: {
timeout: 100,
baseUrl: "",
},
production: {
baseUrl: "",
},
}
export interface ISettings {
baseUrl: string
}
export const config = ({ ...settings._default, ...settings[process.env.NODE_ENV] } as ISettings)