Node.js настраивает специфичные для среды конфиги для использования с EveryAuth - PullRequest
107 голосов
/ 01 декабря 2011

Я использую node.js + express.js + everyauth.js. Я переместил всю свою логику Everyauth в файл модуля

var login = require('./lib/everyauthLogin');

внутри этого я загружаю свой конфигурационный файл oAuth с комбинациями ключ / секрет:

var conf = require('./conf');
.....
twitter: {
    consumerKey: 'ABC', 
    consumerSecret: '123'
}

Эти коды различны для разных сред - разработка / подготовка / производство, так как обратные вызовы для разных URL.

Qu. Как настроить их в конфигурации среды для фильтрации всех модулей или можно передать путь непосредственно в модуль?

Установить в 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 ]

188 голосов
/ 02 декабря 2011

Мое решение,

загрузите приложение, используя

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
55 голосов
/ 20 марта 2014

Вы также можете иметь JSON-файл с NODE_ENV в качестве верхнего уровня. ИМО, это лучший способ выразить настройки конфигурации (в отличие от использования скрипта, который возвращает настройки).

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 } }
    }
}
31 голосов
/ 18 апреля 2016

Очень полезное решение - использовать конфигурационный модуль .

после установки модуля:

$ 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

Это решение очень простое и позволяет легко устанавливать различные конфигурационные файлы для среды производства / подготовки / разработки, а также для локальных настроек.

12 голосов
/ 21 августа 2016

Вкратце

Этот вид установки прост и элегантен:

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/, проверьте его для более подробной информации.

5 голосов
/ 03 марта 2015

Элегантный способ - использовать файл .env для локального переопределения производственных настроек. Нет необходимости в переключателях командной строки. Нет необходимости во всех этих запятых и скобках в файле config.json. Смотрите мой ответ здесь

Пример: на моей машине файл .env такой:

NODE_ENV=dev
TWITTER_AUTH_TOKEN=something-needed-for-api-calls

Мой локальный .env переопределяет любые переменные окружения. Но на промежуточных или производственных серверах (возможно, они находятся на heroku.com) переменные среды предварительно установлены на stage NODE_ENV=stage или production NODE_ENV=prod.

5 голосов
/ 01 декабря 2011

Мы делаем это путем передачи аргумента при запуске приложения со средой.Например:

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);
3 голосов
/ 15 октября 2014

Как насчет того, чтобы сделать это более элегантным способом с модулем nodejs-config .

Этот модуль может устанавливать конфигурационную среду на основе имени вашего компьютера.После этого при запросе конфигурации вы получите значение, специфичное для среды.

Например, предположим, что у вас есть две машины разработки с именами pc1 и pc2 и рабочая машина с именем pc3.Всякий раз, когда вы запрашиваете значения конфигурации в своем коде в pc1 или pc2, вы должны получить конфигурацию среды разработки, а в pc3 вы должны получить конфигурацию среды производства.Это может быть достигнуто следующим образом:

  1. Создайте файл базовой конфигурации в каталоге config, скажем «app.json» и добавьте в него необходимые конфигурации.
  2. Теперь просто создайте папкив каталоге config, который соответствует имени вашей среды, в данном случае «разработка» и «производство».
  3. Затем создайте файлы конфигурации, которые вы хотите переопределить, и укажите параметры для каждой среды в каталогах среды (обратите внимание, что вам не нужно указывать каждый параметр, который находится в базовом файле конфигурации, а только параметры)Вы хотите переопределить. Файлы конфигурации среды будут "каскадно" поверх базовых файлов.).

Теперь создайте новый экземпляр конфигурации со следующим синтаксисом.

var config = require('nodejs-config')(
   __dirname,  // an absolute path to your applications 'config' directory
   {
      development: ["pc1", "pc2"],
      production: ["pc3"],

   }
);

Теперь вы можетеполучить любое значение конфигурации, не беспокоясь об окружающей среде, например:

config.get('app').configurationKey;
...