programing

Node.js 인증마다 사용할 환경별 구성 설정

sourcetip 2023. 7. 31. 22:33
반응형

Node.js 인증마다 사용할 환경별 구성 설정

node.js + express.js + everyauth.js를 사용하고 있습니다.모든 인증 로직을 모듈 파일로 이동했습니다.

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

키/비밀 조합이 포함된 myoAuth 구성 파일을 로드합니다.

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

이치에 맞는 희망

내 해결책은,

를 사용하여 앱 로드

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"와 "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 } }
    }
}

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

모듈 설치 후:

$ 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 경유):

프로세스.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",
  }
}

보통.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.에서 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모든 환경 변수를 재정의합니다. 또는 서버.com 에 수 가 stage로 사전 됩니다.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)

해피 코딩...

nodejs-config 모듈을 사용하여 훨씬 더 우아한 방식으로 이 작업을 수행하는 것은 어떻습니까?

이 모듈은 컴퓨터 이름에 따라 구성 환경을 설정할 수 있습니다.그런 다음 구성을 요청하면 환경별 값을 얻을 수 있습니다.

예를 들어 pc1과 pc2라는 두 개의 개발 시스템과 pc3라는 운영 시스템이 있다고 가정합니다.pc1 또는 pc2에서 코드에 구성 값을 요청할 때마다 "개발" 환경 구성을 받아야 하며 pc3에서는 "운영" 환경 구성을 받아야 합니다.이는 다음과 같이 달성할 수 있습니다.

  1. 구성 디렉터리에 기본 구성 파일을 생성합니다. "app.json"이라고 말하고 필요한 구성을 추가합니다.
  2. 이제 환경 이름(이 경우 "개발" 및 "운영")과 일치하는 폴더를 구성 디렉터리에 생성하기만 하면 됩니다.
  3. 그런 다음 재정의할 구성 파일을 생성하고 환경 디렉토리에서 각 환경에 대한 옵션을 지정합니다(기본 구성 파일에 있는 모든 옵션을 지정할 필요는 없고 재정의하려는 옵션만 지정해야 함).환경 구성 파일은 기본 파일을 "캐스케이드"합니다.

이제 다음 구문을 사용하여 새 구성 인스턴스를 만듭니다.

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가 언급한 것과 유사합니다.하지만 저는 두 가지 이유로 아래의 패턴을 사용합니다.

  1. 외부 npm 종속성이 없는 깔끔한 구현

  2. 기본 구성 설정을 환경 기반 설정과 병합합니다.

자바스크립트 구현

const settings = {
    _default: {
       timeout: 100
       baseUrl: "http://some.api/",
    },
    production: {
       baseUrl: "http://some.prod.api/",
    },
}
// If you are not using ECMAScript 2018 Standard
// https://stackoverflow.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)

언급URL : https://stackoverflow.com/questions/8332333/node-js-setting-up-environment-specific-configs-to-be-used-with-everyauth

반응형