[node.js] 모든 인증과 함께 사용할 환경 특정 구성을 설정하는 Node.js

node.js + express.js + everyauth.js를 사용하고 있습니다. 모든 everyauth 로직을 모듈 파일로 옮겼습니다.

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

이 내부에서 키 / 비밀 조합으로 내 oAuth 구성 파일을로드합니다.

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

이러한 코드는 콜백이 다른 URL에 있으므로 개발 / 스테이징 / 프로덕션과 같이 환경에 따라 다릅니다.

Qu. 모든 모듈을 필터링하도록 환경 구성에서 어떻게 설정합니까? 아니면 모듈에 직접 경로를 전달할 수 있습니까?

환경에서 설정 :

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'});
});

? 말이되는 희망



답변

내 솔루션,

다음을 사용하여 앱로드

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


답변

최상위 레벨로 NODE_ENV가있는 JSON 파일을 가질 수도 있습니다. 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 } }
    }
}


답변

매우 유용한 솔루션은 config 모듈을 사용하는 것 입니다.

모듈 설치 후 :

$ npm install config

default.json 구성 파일을 만들 수 있습니다 . (확장자 .json5를 사용하여 JSON 또는 JS 객체를 사용할 수 있습니다)

예를 들면

$ 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
}

로컬 PC에서 모든 환경을 재정의 하는 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

이 솔루션은 매우 깨끗하며 프로덕션 / 스테이징 / 개발 환경 및 로컬 설정에 대해 서로 다른 구성 파일을 쉽게 설정할 수 있습니다.


답변

간단히

이러한 종류의 설정은 간단하고 우아합니다.

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/ 에서 확인하십시오. 자세한 세부 사항.


답변

이를 수행하는 방법은 환경으로 앱을 시작할 때 인수를 전달하는 것입니다. 예를 들면 :

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);


답변

우아한 방법은 .env파일 을 사용 하여 프로덕션 설정을 로컬로 재정의하는 것입니다. 명령 줄 스위치가 필요하지 않습니다. config.json파일 에있는 모든 쉼표와 대괄호는 필요하지 않습니다 . 여기에서 내 대답보기

예 : 내 컴퓨터에서 .env파일은 다음과 같습니다.

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

내 로컬 .env은 모든 환경 변수를 재정의합니다. 그러나 스테이징 또는 생산 서버에 변수가 무대에 미리 설정되어있는 환경 (어쩌면 그들은 heroku.com에있어) NODE_ENV=stage또는 생산 NODE_ENV=prod.


답변

배포 서버에서 환경 변수를 설정합니다 (예 : 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)

해피 코딩 …