Node.js 배포 설정 / 구성 파일을 저장하는 방법?


640

몇 가지 Node 앱을 개발하고 있으며 배포 관련 설정을 저장하는 좋은 패턴을 찾고있었습니다. Django 세계 (내 출신)의 일반적인 관행은 settings.py표준 설정 (시간대 등)을 포함 한 파일 local_settings.py을 배치 한 다음 배치 특정 설정을위한 것입니다. 대화 할 데이터베이스, memcache 소켓, 관리자의 전자 메일 주소 등

Node와 비슷한 패턴을 찾고 있습니다. 구성 파일 만 있으면 좋을 것이므로의 다른 모든 항목으로 채워질 app.js필요는 없지만 소스 제어가 아닌 파일에서 서버 별 구성을 갖는 방법이 중요합니다. 동일한 앱을 설정이 서로 다른 여러 서버에 배포 할 수 있으며 병합 충돌을 처리해야 할뿐 아니라 재미있는 아이디어도 아닙니다.

그래서 이것을위한 일종의 프레임 워크 / 도구가 있습니까, 아니면 모두가 스스로 무언가를 해킹합니까?


구성이 mean.js 에서 수행되는 방식이 정말 좋습니다 . 기본적으로, 앱 관련 구성은 앱 환경마다 다른 설정 (생산, 개발, 테스트 용)을 기반으로 비밀과 같은 앱 환경 변수를 통해 특정 세부 정보를 전달하는 별도의 모듈로 저장됩니다.
Hinrich

답변:


765

package.json패키지와 config.js구성에 a 를 사용합니다 .

var config = {};

config.twitter = {};
config.redis = {};
config.web = {};

config.default_stuff =  ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password=  process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;

module.exports = config;

내 프로젝트에서 구성을로드합니다.

var config = require('./config');

그리고 내가에서 내 물건에 액세스 할 수 있습니다 config.db_host, config.db_port등 ...이 나에게 내가 소스 제어에서 암호를 저장하지 않으려면 환경 변수에 저장하거나 사용하는 하드 코딩 매개 변수 또는 매개 변수를 할 수 있습니다.

또한 package.json의존성 섹션을 생성 하고 삽입합니다.

"dependencies": {
  "cradle": "0.5.5",
  "jade": "0.10.4",
  "redis": "0.5.11",
  "socket.io": "0.6.16",
  "twitter-node": "0.0.2",
  "express": "2.2.0"
}

프로젝트를 로컬 컴퓨터에 복제 npm install하면 패키지를 설치하기 위해 실행 됩니다. 여기 에 대한 자세한 정보 .

프로젝트는 GitHub에 저장되며 프로덕션 서버에 리모컨이 추가되었습니다.


32
dev와 prod에 대한 구성 설정이 다르면 어떻게됩니까?
chovy

4
나는 여기에 한 가지 방법이 있습니다. 각 env에 대해 env 이름을 ENV 변수에 설정하십시오. 그런 다음이 파일에서 해당 javascript ..는 case 또는 if 문을 사용하여 적절한 변수를 선택적으로로드합니다. 각 env에 대해 별도의 구성 하위 파일을 만들고 if 문에서 하위 파일을 하위 구성 var로 다시로드하고 해당 하위 구성 var를 기본 구성으로 내 보냅니다. 기본적으로 말하려는 것은 js, 창의성을
발휘할

4
어떤 process.env? 어디에서 찾습니까? 어떻게 설정합니까?
화난 키위

12
"어쩌면 내가 생각 해낸 코드의 임의 비트 공유 할 BTW, .. 와우 .. 내가 몇 시간 동안 Node.js를보고있다 그리고 내 응용 프로그램은 이미 작동하고"나는 생각했다
간섭해서는

3
패스 변수를 저장하기 위해 여전히 환경 변수를 사용할 수 없습니까? 이 줄이 아닌가 : config.twitter.password = process.env.TWITTER_PASSWORD || '암호';
DMart

244

Node v0.5.x부터 JSON 파일이 필요할 수 있습니다 ( 이 답변 참조). ).

config.json :

{
    "username" : "root",
    "password" : "foot"
}

app.js :

var config = require('./config.json');
log_in(config.username, config.password);

40
그 기능에는 그리 인상적이지 않습니다. 당신은 require ( "./ config.js") 할 수 있고 매우 중요하다고 생각되는 설정 파일과 다른 종소리와 휘파람에 주석을 추가 할 수 있습니다. 당신은 설정 JSON은 exports.config = 접두사 당신과 함께 단지 특성과 요구 (config.js)에 의해 어떤 코드를 당신에게 느슨한 아무것도 경우
teknopaul

3
@teknopaul 당신이 맞지만 벙어리 대 스마트 템플릿 시스템을 사용하는 '정확성'/ 유용성에 대해 큰 토론이있었습니다. (2) 템플릿 (또는 구성)을 수행하기 위해 "거의 PL"을 재구성하는 것이 좋지 않습니다. 기존의 실제 PL을 알려진 동작으로 재사용하는 것이 좋습니다. 지금까지 +1로 JS를 재활용하여 사용자 설정을 수행합니다. 선언적 접근 방식을 따르지 않은 경우 -1입니다. 우리는 매우 복잡한 설정 작업이 선언적인 방식으로 수행되는 것을 보았습니다. 내 직감은 이것이 갈 길이라고 말해줍니다.
흐름

1
VScode에서 json 파일의 객체에 대한 정보가 없습니다 (2017 년 끝). module.exports의 객체에 대해 완벽하게 작동합니다.
Romain Vincent

199

훨씬 나중에, 구성 관리를위한 꽤 좋은 Node.js 모듈을 찾았습니다 : nconf .

간단한 예 :

var nconf = require('nconf');

// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();

// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });

// Provide default values for settings not provided above.
nconf.defaults({
    'http': {
        'port': 1337
    }
});

// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));

또한 Redis에 설정을 저장 하고 구성 파일을 작성하며 상당히 견고한 API를 보유하고 있으며 Flatiron의 일부로 Node.js 상점 인 Nodejitsu의 지원을받습니다 . 프레임 워크 이니셔티브의 있습니다. 상당히 미래 지향적입니다.

Github에서 nconf를 확인하십시오 .


2
어리석은 질문 일지 모르지만 명확한 설명을 보지 못했습니다. 노드 환경 변수를 어디에 설정합니까? 이미 nconf를 사용하고 있지만 환경 변수를 어디에 설정할지 확실하지 않습니다. nginx / apache에 있습니까? 다른 구성 파일입니까?
민간인

91
주석이 허용되지 않으므로 .json 파일을 구성으로 사용하는 것이 좋습니다.
Frank Xu

11
멋지다. 설정 파일이 명령 행 옵션과 환경 변수를 재정의하면 많은 Unixheads를 놀라게 할 것입니다. 우리는 구성 파일, 환경 변수, 명령 행 옵션과 같은 오름차순 우선 순위에 익숙합니다.
sheldonh

2
@sheldonh 부울 옵션이 항상 argv에 설정되어 우선 순위를 위반 한다는 것을 알 때까지 기다리십시오 . : /
Daniel C. Sobral

@ DanielC.Sobral 진짜 부끄러운 일입니다. 아, 그리고 LTNS! :-)
쉘던

94

내 솔루션은 매우 간단합니다.

./config/index.js에서 환경 구성을로드하십시오.

var env = process.env.NODE_ENV || 'development'
  , cfg = require('./config.'+env);

module.exports = cfg;

./config/config.global.js에서 일부 기본값을 정의하십시오.

var config = module.exports = {};

config.env = 'development';
config.hostname = 'dev.example.com';

//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';

./config/config.test.js의 기본값을 재정의하십시오.

var config = require('./config.global');

config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';

module.exports = config;

./models/user.js에서 사용 :

var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);

테스트 환경에서 앱 실행 :

NODE_ENV=test node ./app.js

2
나는 이것을 선호합니다. 다른 사람들이 언급했듯이 JSON은 선호하는 스토리지 구조가 아니며 전역을 사용한이 계층화는 간단하고 효과적입니다
Sebastian J.

내가 nconf보다 이것을 선호하는 유일한 이유는 구성 (dev, test 및 prod) 파일에 .js 형식을 허용하기 때문입니다. JSON 형식으로는 불가능한 각 구성 옵션을 문서화 할 수 있습니다.
Kunal Kapadia

BTW, NODE_ENV기본값은 'development'입니다. 대신 '생산'을 확인해야합니다.
Kevin Suttle

5
개발을 확인하지 않습니다. 나는 그것을 기본값으로하고 있습니다. 내가 왜 기본적으로 프로덕션을 사용하는지 잘 모르겠습니다.
chovy 2019

39

12 개의 앱 의 신조를 따르는 dotenv 를 볼 수도 있습니다 .

나는 node-config를 사용했지만 그 이유로 dotenv를 만들었습니다. 루비의 dotenv 라이브러리에서 완전히 영감을 얻었습니다.

사용법은 매우 쉽습니다.

var dotenv = require('dotenv');
dotenv.load();

그런 다음 .env 파일을 만들고 다음과 같이 설정을 저장하십시오.

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

그것은 nodejs에 대한 dotenv입니다.


2
또는 foreman run node xx.js이것을 사용 하면 자동으로 .env 파일을 읽습니다.
사이먼

1
이 접근법을 생산에도 사용할 수 있습니까?
Lamour

1
@lamar 아니오, 실제 서버의 env 변수에 설정하십시오. 배포 할 때마다 소스 코드에는 없지만 소스 코드에는 없습니다.
sidonaldson

@Lamar 그렇습니다. 실제로 서버에서 환경 변수를 설정하는 더 편리한 대안으로 가능합니다. 중요한 점은 파일을 버전 관리 또는 배포 프로세스에 포함 시키지 않는.env 것입니다.
Josh Noe

31

npm을 사용하여 스크립트 (env 등)를 시작하고 있습니까?

.env파일 을 사용하는 경우 파일을 포함하고 package.json npm을 사용 하여 파일 을 소스 / 시작할 수 있습니다.

예:

{
  "name": "server",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node test.js",
    "start-dev": "source dev.env; node test.js",
    "start-prod": "source prod.env; node test.js"
  },
  "dependencies": {
    "mysql": "*"
  }
}

그런 다음 npm 스크립트를 실행하십시오.

$ npm start-dev

여기에 설명되어 있습니다 https://gist.github.com/ericelliott/4152984 Eric Elliot의 모든 크레딧


2
"소스"가 무엇인지 설명 할 수 있습니까? 나는 얻는다source : not found
JohnnyBizzle

@JohnnyBizzle source(또는 간단히 .)는 Unix 쉘 (Bash 등)에 내장 된 명령 으로, 현재 파일에서 주어진 파일의 명령을 읽고 실행합니다 . 즉, 명령은 하위 셸에서 실행되지 않습니다. 이 예제에서 그 효과는 정의 된 환경 변수 prod.env가 현재 쉘에 추가되어이 쉘이 생성 한 모든 자식 프로세스에 전달된다는 것입니다. Windows CMD를 사용하고있는 것 같습니다. 자세한 내용은 이 질문 을 참조하십시오.
Utku

가치는 지적 - 12 팩터 응용 프로그램은 권장 하지 생성 dev.env하고 prod.env,하지만 하나 가지고 .env배포 당 파일을.
Iiridayn

24

$ HOST$ NODE_ENV 변수 (RoR과 약간 유사)에 따라 구성 파일을로드 하는 node-config 를 참조하십시오. documentation .

이것은 다른 배포 설정 (에 매우 유용 할 수 있습니다 development, test또는 production).


22

다음 settings.jsexports같이 간단하게 수행하십시오 .

exports.my_password = 'value'

그런 다음 스크립트에서 다음을 수행하십시오 require.

var settings = require('./settings.js');

settings변수 를 통해 모든 설정을 사용할 수 있습니다 .

settings.my_password // 'value'

@backdesk 물론 비밀을 암호화하고 ip, 일부 토큰 등을 사용하여 액세스를 제한하는 비밀 스토리지 시스템을 설정할 수 있습니다. 그러나 결국에는 디스크에서 일부 파일을 읽거나 암호화하거나 아니.
Vanuan

@backdesk 예제에는 문제가 없습니다. 구체적인 내용을 설명하기위한 예입니다.
Emilio Grisolía

14

이 답변 중 어느 것도 거의 모든 시스템에 필요한 모든 중요한 구성 요소를 다루지 않기 때문에 모자에 고리를 던질 것입니다. 고려 사항 :

  • 공개 구성 (프론트 엔드에서 볼 수 있음) 대 개인 구성 (guy mograbi 가이 권리를 얻었습니다). 그리고 이것들은 분리되어 유지됩니다.
  • 열쇠 같은 비밀
  • 기본값과 환경 별 재정의
  • 프론트 엔드 번들

구성을 수행하는 방법은 다음과 같습니다.

  • config.default.private.js -버전 관리에서이 옵션은 백엔드에서만 볼 수있는 기본 구성 옵션입니다.
  • config.default.public.js-버전 관리에서 백엔드 백엔드에서 볼 수있는 기본 구성 옵션입니다. 프론트 엔드에서
  • config.dev.private.js -개발자에게 다른 개인 기본값이 필요한 경우
  • config.dev.public.js -개발자에게 다른 공개 기본값이 필요한 경우
  • config.private.js -버전 관리가 아닌, 환경에 따른 옵션보다 우선합니다. config.default.private.js
  • config.public.js -버전 관리가 아닌, 환경에 따른 옵션보다 우선합니다. config.default.public.js
  • keys/-각 파일이 어떤 종류의 다른 비밀을 저장하는 폴더. 또한 버전 제어를받지 않습니다 (키는 버전 제어를받지 않아야합니다).

구성에 일반 오래된 자바 스크립트 파일을 사용하므로 자바 스크립트 언어의 모든 기능 (댓글 및 환경 설정 파일에 기본 구성 파일을로드하여 재정의 할 수있는 기능 포함)을 최대한 활용할 수 있습니다. 환경 변수를 사용하려면 해당 구성 파일에 변수를로드 할 수 있습니다 (json 파일 사용을 권장하지 않는 것과 같은 이유로 env vars를 사용하지 않는 것이 좋습니다-구성 할 프로그래밍 언어의 힘이 없습니다) 구성).

각 키가 별도의 파일에있는 이유는 설치 관리자가 사용하기위한 것입니다. 이를 통해 컴퓨터에 키를 생성하고 키 폴더에 저장하는 설치 관리자를 가질 수 있습니다. 이것이 없으면 키에 액세스 할 수없는 구성 파일을로드 할 때 설치 관리자가 실패 할 수 있습니다. 이 방법으로 디렉토리를 탐색하고 존재하는 코드와 코드의 어떤 버전에없는 것에 대해 걱정할 필요없이 해당 폴더에있는 키 파일을로드 할 수 있습니다.

당신은 아마 개인 구성에로드 키를 가지고 있기 때문에, 당신은 확실히 어떤 프론트 엔드 코드에서 개인 설정을로드하지 않습니다. 프론트 엔드 코드베이스를 백엔드에서 완전히 분리하는 것이 더 이상적 일 수 있지만 PITA는 사람들이이를 수행하지 못하도록하기에 충분히 큰 장벽이므로 개인 대 공개 구성입니다. 그러나 프런트 엔드에 개인 설정이로드되는 것을 방지하기 위해 두 가지 작업이 있습니다.

  1. 프론트 엔드 번들에 개인 설정에있는 비밀 키 중 하나가 포함되어 있지 않은지 확인하는 단위 테스트가 있습니다.
  2. 백엔드 코드와 다른 폴더에 프론트 엔드 코드가 있고 각 끝에 하나씩 "config.js"라는 두 개의 다른 파일이 있습니다. 백엔드의 경우 config.js는 개인용 구성을로드하고 프론트 엔드의 경우 공용 구성을로드합니다. 그런 다음 항상 요구 ( 'config')하고 그것이 어디에서 오는지 걱정하지 마십시오.

마지막으로, 구성은 다른 프론트 엔드 코드와 완전히 다른 파일을 통해 브라우저에로드해야합니다 . 프론트 엔드 코드를 번들로 제공하는 경우 공용 구성은 완전히 별도의 번들로 빌드되어야합니다. 그렇지 않으면 구성이 더 이상 구성되지 않으며 코드의 일부입니다. 구성은 컴퓨터마다 다를 수 있어야합니다.


13

유죄 판결 은 유효성 검사를 위해 스키마를 추가하는 또 다른 옵션입니다. nconf와 마찬가지로 환경 변수, 인수, 파일 및 json 객체의 조합에서 설정로드를 지원합니다.

README의 예 :

var convict = require('convict');
var conf = convict({
  env: {
    doc: "The applicaton environment.",
    format: ["production", "development", "test"],
    default: "development",
    env: "NODE_ENV"
  },
  ip: {
    doc: "The IP address to bind.",
    format: "ipaddress",
    default: "127.0.0.1",
    env: "IP_ADDRESS",
  },
  port: {
    doc: "The port to bind.",
    format: "port",
    default: 0,
    env: "PORT"
  }
});

시작하기 기사 : 노드 유죄 판결을 통한 구성 길들이기


12

환경 별 구성 파일에 Konfig 를 사용할 수 있습니다 . json 또는 yaml 구성 파일을 자동으로로드하며 기본값 및 동적 구성 기능이 있습니다.

Konfig 저장소의 예 :

File: config/app.json
----------------------------
{
    "default": {
        "port": 3000,
        "cache_assets": true,
        "secret_key": "7EHDWHD9W9UW9FBFB949394BWYFG8WE78F"
    },

    "development": {
        "cache_assets": false
    },

    "test": {
        "port": 3001
    },

    "staging": {
        "port": #{process.env.PORT},
        "secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
    },

    "production": {
        "port": #{process.env.PORT},
        "secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
    }
}

개발 중 :

> config.app.port
3000

프로덕션에서는 응용 프로그램을 시작한다고 가정합니다. $ NODE_ENV=production PORT=4567 node app.js

> config.app.port
4567

자세한 내용은 https://github.com/vngrs/konfig


9

파일 이름을 구성 파일로 폴더를 만들고 config.js나중에 필요한 경우이 파일을 사용합니다.

config.js의 예

module.exports = {
    proxyURL: 'http://url:port',
    TWITTER: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    },
    GOOGLE: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    },
    FACEBOOK: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    }
}

그런 다음이 구성 파일을 어딘가에 사용하려면

먼저 아래와 같이 가져옵니다

var config = require('./config');

아래와 같이 값에 액세스 할 수 있습니다

const oauth = OAuth({
    consumer: {
        key: config.TWITTER.consumerkey,
        secret: config.TWITTER.consumerSecrete
    },
    signature_method: 'HMAC-SHA1',
    hash_function(base_string, key) {
        return crypto.createHmac('sha1', key).update(base_string).digest('base64');
    }
});

6

npm모듈 만 사용하십시오 config(300000 회 이상 다운로드)

https://www.npmjs.com/package/config

Node-config는 앱 배포를위한 계층 적 구성을 구성합니다.

기본 매개 변수 세트를 정의하고 다른 전개 환경 (개발, qa, 스테이징, 프로덕션 등)에 맞게 확장 할 수 있습니다.

$ npm install config
$ mkdir config
$ vi config/default.json


{
      // Customer module configs
      "Customer": {
        "dbConfig": {
          "host": "localhost",
          "port": 5984,
          "dbName": "customers"
        },
        "credit": {
          "initialLimit": 100,
          // Set low for development
          "initialDays": 1
        }
      }
}



$ vi config/production.json

{
  "Customer": {
    "dbConfig": {
      "host": "prod-db-server"
    },
    "credit": {
      "initialDays": 30
    }
  }
}



$ vi index.js

var config = require('config');
//...
var dbConfig = config.get('Customer.dbConfig');
db.connect(dbConfig, ...);

if (config.has('optionalFeature.detail')) {
  var detail = config.get('optionalFeature.detail');
  //...
}


$ export NODE_ENV=production
$ node index.js

4

'개발''생산' 구성 을 분리하는 것이 좋습니다 .

나는 다음과 같은 방법을 사용 합니다 : config / index.js 파일 은 다음과 같습니다 .

const config = {
    dev : {
        ip_address : '0.0.0.0',
        port : 8080,
        mongo :{
            url : "mongodb://localhost:27017/story_box_dev",
            options : ""
        }
    },
    prod : {
        ip_address : '0.0.0.0',
        port : 3000,
        mongo :{
            url : "mongodb://localhost:27017/story_box_prod",
            options : ""
        }
    }
} 

구성을 사용하려면 다음을 사용하십시오.

const config = require('../config')[process.env.NODE_ENV];

설정 객체를 사용할 수있는 것보다 :

const ip_address = config.ip_address;
const port = config.port;

또한 당신이 할 수있는 사용자 module.exports = config;의 끝에서 config/index.js파일
mapmalith

3

나는 게임에서 조금 늦었지만 여기 또는 다른 곳에서 필요한 것을 찾을 수 없었으므로 직접 뭔가를 썼습니다.

구성 메커니즘에 대한 요구 사항은 다음과 같습니다.

  1. 프론트 엔드를 지원하십시오. 프론트 엔드가 구성을 사용할 수 없다면 요점은 무엇입니까?
  2. 지원 settings-overrides.js– 동일하게 보이지만에서 구성을 재정의 할 수 있습니다 settings.js. 여기서 아이디어는 코드를 변경하지 않고 구성을 쉽게 수정하는 것입니다. 나는 saa에 유용하다고 생각합니다.

지원 환경에 대해 덜 신경 쓰지만 솔루션에 쉽게 추가하는 방법에 대해 설명합니다.

var publicConfiguration = {
    "title" : "Hello World"
    "demoAuthToken" : undefined, 
    "demoUserId" : undefined, 
    "errorEmail" : null // if null we will not send emails on errors. 

};

var privateConfiguration = {
    "port":9040,
    "adminAuthToken":undefined,
    "adminUserId":undefined
}

var meConf = null;
try{
    meConf = require("../conf/dev/meConf");
}catch( e ) { console.log("meConf does not exist. ignoring.. ")}




var publicConfigurationInitialized = false;
var privateConfigurationInitialized = false;

function getPublicConfiguration(){
    if (!publicConfigurationInitialized) {
        publicConfigurationInitialized = true;
        if (meConf != null) {
            for (var i in publicConfiguration) {
                if (meConf.hasOwnProperty(i)) {
                    publicConfiguration[i] = meConf[i];
                }
            }
        }
    }
    return publicConfiguration;
}


function getPrivateConfiguration(){
    if ( !privateConfigurationInitialized ) {
        privateConfigurationInitialized = true;

        var pubConf = getPublicConfiguration();

        if ( pubConf != null ){
            for ( var j in pubConf ){
                privateConfiguration[j] = pubConf[j];
            }
        }
        if ( meConf != null ){
              for ( var i in meConf ){
                  privateConfiguration[i] = meConf[i];
              }
        }
    }
    return privateConfiguration;

}


exports.sendPublicConfiguration = function( req, res ){
    var name = req.param("name") || "conf";

    res.send( "window." + name + " = " + JSON.stringify(getPublicConfiguration()) + ";");
};


var prConf = getPrivateConfiguration();
if ( prConf != null ){
    for ( var i in prConf ){
        if ( prConf[i] === undefined ){

            throw new Error("undefined configuration [" + i + "]");
        }
        exports[i] = prConf[i];
    }
}


return exports;

설명

  • undefined 이 속성이 필요하다는 의미
  • null 선택 사항임을 의미합니다.
  • meConf-현재 코드는 아래의 파일을 대상으로합니다 app. meConf대상 파일을 재정의합니다 conf/dev-내 vc에서 무시합니다.
  • publicConfiguration -프론트 엔드 및 백엔드에서 볼 수 있습니다.
  • privateConfiguration -백엔드에서만 볼 수 있습니다.
  • sendPublicConfiguration-공개 구성을 노출하고 전역 변수에 할당하는 경로입니다. 예를 들어 아래 코드는 공용 구성을 프런트 엔드에서 전역 변수 myConf로 표시합니다. 기본적으로 전역 변수 이름을 사용합니다conf .

    app.get ( "/ backend / conf", require ( "conf"). sendPublicConfiguration);

재정의의 논리

  • privateConfiguration은 publicConfiguration과 병합 된 다음 meConf와 병합됩니다.
  • publicConfiguration은 각 키에 재정의가 있는지 확인하고 해당 재정의를 사용합니다. 이 방법으로 우리는 사적인 것을 노출시키지 않습니다

환경 지원 추가

"환경 지원"이 유용하지 않더라도 누군가는 도움이 될 것입니다.

환경 지원을 추가하려면 meConf require 문을 다음과 같이 변경해야합니다 (의사 코드).

if (environment == "production") {meConf = require ( "../ conf / dev / meConf"). production; }

if (environment == "development") {meConf = require ( "../ conf / dev / meConf"). development; }

마찬가지로 환경 당 파일을 가질 수 있습니다

 meConf.development.js
 meConf.production.js

올바른 것을 가져옵니다. 나머지 논리는 동일하게 유지됩니다.


undefined실제로 '필수'를 null의미하고 '선택적'을 의미 한다는 것은 분명하지 않습니다 . 노란색 빈은 플라스틱 용이고 파란색 빈은 스크랩 용지 용입니다. 괜찮지 만 쓰레기를 던지기 전에 매뉴얼을 읽어야했습니다.
흐름

이 규칙을 사용할 필요는 없습니다. 유용하다고 생각하고 팀에 사용하도록 지시했지만이 기능을 분명히 제거 할 수 있습니다.
guy mograbi

3

방금 사용한 .json 파일보다 더 많은 유연성을 원했지만 종속성이 필요한 라이브러리로 추상화하지 않기 때문에 방금 사용한 대체 예제는 다음과 같습니다. 기본적으로 함수를 내 보내면 즉시 설정 한 값을 가진 객체가 반환됩니다. 많은 유연성을 제공합니다.

     module.exports = function(){
       switch(node_env){
         case 'dev':
           return
           { var1 = 'development'};
         }
    }();

전체 예제를 통해 훨씬 더 나은 설명이 있습니다. Node.js에서 구성 파일 사용


3

나는 이것이 정말로 오래된 게시물이라는 것을 알고있다. 그러나 환경 변수 구성을 위해 모듈을 공유하고 싶습니다. 매우 유연한 솔루션이라고 생각합니다. 다음은 json-configurator 모듈입니다

var configJson = {
  'baseUrl': 'http://test.com',
  '$prod_baseUrl': 'https://prod.com',
  'endpoints': {
    'users': '<%= baseUrl %>/users',
    'accounts': '<%= baseUrl %>/accounts'
    },
  foo: 'bar',
  foobar: 'foobar',
  $prod_foo: 'foo in prod',
  $test_foo: 'foo in test',
  deep:{
    veryDeep: {
      publicKey: 'abc',
      secret: 'secret',
      $prod_secret: 'super secret'
    }
  }
};

var config = require('json-configurator')(configJson, 'prod');

console.log(config.deep.veryDeep.secret) 
// super secret 

console.log(config.endpoints.users)
// https://prod.com/users 

그런 다음 process.env.NODE_ENV환경에 대한 모든 변수를 얻는 데 사용할 수 있습니다.


2

받는 사람 또한 nconf 모듈 에서 언급 이 답변 하고, 노드 설정 에서 언급 이 답변 도있다 노드 iniparserIniReader 간단 .INI 구성 파일 파서 것으로 보인다.


win-ini 파일로 돌아갈 수있는 방법은 없습니다 iniparser... 2013 년에 구성의 섹션을 구문 분석하는 방법을 알고 있다는 사실 을 자랑스럽게 강조합니다 ... 더 깊은 중첩이 필요한 경우 [foo/bar]? [foo\bar]? bar.baz=42? bar/baz=42? bar\baz=42? bar:baz=42? 42숫자는 어떻게 알 수 있습니까? XML, YAML 던지기, WIN.INI 던지기, JSON 수용, 걱정이 사라졌습니다.
흐름


1

pconf를 사용할 수 있습니다 : https://www.npmjs.com/package/pconf

예:

var Config = require("pconf");
var testConfig = new Config("testConfig");
testConfig.onload = function(){

  testConfig.setValue("test", 1);
  testConfig.getValue("test");
  //testConfig.saveConfig(); Not needed

}

1

이 기사에서 영감을 얻은 깔끔한 접근 방식은 다음과 같습니다 . 유비쿼터스 lodash 패키지를 제외한 추가 패키지는 필요하지 않습니다 . 또한 환경 별 덮어 쓰기로 중첩 된 기본값을 관리 할 수 ​​있습니다.

먼저 패키지 루트 경로에 다음과 같은 구성 폴더를 만듭니다.

package
  |_config
      |_ index.js
      |_ defaults.json
      |_ development.json
      |_ test.json
      |_ production.json

다음은 index.js 파일입니다

const _ = require("lodash");
const defaults = require("./defaults.json");
const envConf = require("./" + (process.env.NODE_ENV || "development") + ".json" );
module.exports = _.defaultsDeep(envConf, defaults);

이제 기본값이 있다고 가정 해 봅시다.

{
  "confKey1": "value1",
  "confKey2": {
    "confKey3": "value3",
    "confKey4": "value4"
  }
}

그리고 development.json처럼

{
  "confKey2": {
    "confKey3": "value10",
  }
}

당신이 config = require('./config')여기에 있다면 당신이 얻을 것입니다

{
  "confKey1": "value1",
  "confKey2": {
    "confKey3": "value10",
    "confKey4": "value4"
  }
}

환경 별 파일에 정의 된 값을 제외한 모든 기본값을 얻습니다. 따라서 구성 계층을 관리 할 수 ​​있습니다. 를 사용 defaultsDeep하면 중첩 된 기본값을 가질 수도 있습니다.



0

나는 여기에 제안 된 해결책 중 일부를 시도했지만 그에 만족하지 않았기 때문에 내 자신의 모듈을 만들었습니다. 그것은이라고mikro-config 되고 주요 차이점은 구성에 대한 규칙을 준수한다는 것이므로 모듈을 요구하고 사용하기 시작할 수 있습니다.

구성을 일반 js 또는 /config폴더의 json 파일에 저장합니다. 먼저 default.js파일을 /config로드 한 다음 디렉토리 에서 다른 모든 파일을 로드 한 다음 $NODE_ENV변수를 기반으로 환경 별 구성을로드합니다 .

또한 local.js환경 별 또는 특정 환경의 로컬 개발을 위해이 구성을 재정의 할 수 있습니다 /config/env/$NODE_ENV.local.js.

여기에서 볼 수 있습니다.

https://www.npmjs.com/package/mikro-config

https://github.com/B4nan/mikro-config


0

오랫동안 여기에 솔루션에 언급 된 접근 방식을 사용했습니다. 그러나 비밀 텍스트의 보안에 대한 우려는 분명한 텍스트입니다. config보안 비트가 처리되도록 다른 패키지를 사용할 수도 있습니다 .

이것을 확인하십시오 : https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/


이 서비스에 대한 비용을 지불하기 위해 Azure에 가입해야하는 이유는 무엇입니까? 왜 볼트를 사용하지 않습니까? 또 다른 것은 : 아무도 소스 저장소에 일반 텍스트 자격 증명이있는 구성 파일을 게시하지 않을 것이라고 생각합니다. 환경 변수를 사용하거나 읽기 전용 권한이있는 파일에 비밀 데이터를 저장하십시오.
Yasser Sinjab

만약 당신이 어떤 제 3 자 위치에서 그것을 읽고 해독 할 수 있고 당신의 서비스가 그 최고 비밀 데이터를 사용하게한다면, 해커가 당신의 컴퓨터에 접근 할 때 정확하게 똑같이 할 수있을 것입니다. 그것은 더 많은 일이지만 (더 오래 걸립니다) 결국에는 당신을 보호하지 않습니다. 서버가 침투 한 경우 서버에있는 모든 것이 공개 된 것으로 가정하십시오.
Alexis Wilke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.