programing

Node.js 배포 설정/구성 파일을 저장하는 방법은 무엇입니까?

stoneblock 2023. 5. 14. 10:05

Node.js 배포 설정/구성 파일을 저장하는 방법은 무엇입니까?

저는 몇 가지 노드 앱에서 작업을 해왔고 배포 관련 설정을 저장하는 좋은 패턴을 찾고 있었습니다.장고 세계(제가 태어난 곳)에서 일반적인 관행은 다음과 같습니다.settings.py 등한 파일을 한 후, " " " " " " " " " " " " " " " " " " " " " " ( " " " " " " " " " " " " 을 입력합니다.local_settings.py배포 관련 설정(예: 대화할 데이터베이스, memcache 소켓, 관리자용 전자 메일 주소 등).

노드에 대한 비슷한 패턴을 찾고 있습니다.구성 파일만 있으면 되므로 다른 모든 것과 함께 끼울 필요가 없습니다.app.js그러나 소스 제어에 없는 파일에서 서버별 구성을 사용하는 것이 중요하다고 생각합니다.동일한 앱이 완전히 다른 설정을 가진 서로 다른 서버에 배포될 수 있으며 병합 충돌을 처리해야 하는 등 제가 생각하는 재미는 아닙니다.

그렇다면 이를 위한 일종의 프레임워크/툴이 있을까요, 아니면 모두가 스스로 무언가를 해킹하는 것일까요?

사용합니다.package.json와 의나소그리고들a.config.js다음과 같은 구성입니다.

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에 저장되며, 운영 서버용으로 원격이 추가됩니다.

Node v0.5.x에서 JSON 파일을 요구할 수 있습니다( 답변 참조).

config.json:

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

app.js:

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

훨씬 후에 구성을 관리하기 위한 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를 확인하십시오.

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

./config/index.js에 환경 구성을 로드합니다.

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

module.exports = cfg;

./config/config.global에서 일부 기본값을 정의합니다.제이에스

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

당신은 또한 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입니다.

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

사용하는 경우.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 모든 신용은 에릭 엘리엇에게 있습니다.

$HOST 및 $NODE_ENV 변수(RoR과 약간 유사함)에 따라 구성 파일을 로드하는 node-config: 설명서도 참조할 수 있습니다.

배포 할 수 있습니다(「 」 다는매유수있다습니용이할우배설정에양한포).development,test또는production).

▁a.settings.js와 함께exports:

exports.my_password = 'value'

그런 다음 스크립트에서 다음을 수행합니다.require:

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

은 이제모설수있다니습사용을 통해 할 수 .settings변수:

settings.my_password // 'value'

Confect는 유효성 검사를 위해 스키마를 추가하는 또 다른 옵션입니다.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"
  }
});

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

저는 이 질문에 대답할 것이 없기 때문에 모든 시스템에 필요한 모든 중요한 구성요소를 해결할 수 없습니다.고려 사항:

  • 공용 구성(프론트엔드에서 볼 수 있음)과 개인 구성(guymograbi가 이 문제를 제대로 해결했습니다.그리고 이것들이 분리되어 있는지 확인합니다.
  • 열쇠 같은 비밀
  • 기본값 대 환경별 재정의
  • 프런트 엔드 번들

구성 방법은 다음과 같습니다.

  • config.default.private.js버전 제어에서는 백엔드에서만 볼 수 있는 기본 구성 옵션입니다.
  • config.default.public.js버전 제어에서 백엔드 및 프런트엔드에서 볼 수 있는 기본 구성 옵션입니다.
  • config.dev.private.jsdev에 .
  • config.dev.public.jsdev에 .
  • config.private.js으로 버전제음없을 하는 옵션입니다.config.default.private.js
  • config.public.js으로 버전제음없을 하는 옵션입니다.config.default.public.js
  • keys/각 파일이 다른 종류의 암호를 저장하는 폴더입니다.이것도 버전 제어 하에 있지 않습니다(키는 버전 제어 하에 있으면 안 됩니다).

저는 일반적인 오래된 Javascript 파일을 구성에 사용하므로 Javascript 언어의 모든 기능(댓글 및 환경별 파일에 기본 구성 파일을 로드하여 재정의할 수 있는 기능 포함)을 사용합니다.환경 변수를 사용하려면 해당 구성 파일 내에 로드할 수 있습니다(Json 파일을 사용하지 않는 것과 동일한 이유로 환경 변수를 사용하지 않는 것이 좋습니다. 즉, 구성을 구성할 프로그래밍 언어의 힘이 없습니다.).

각 키가 별도의 파일에 있는 이유는 설치 프로그램을 사용하기 위한 것입니다.이를 통해 컴퓨터에서 키를 생성하고 키 폴더에 저장하는 설치 관리자를 사용할 수 있습니다.그렇지 않으면 키에 액세스할 수 없는 구성 파일을 로드할 때 설치 관리자가 실패할 수 있습니다.이렇게 하면 코드의 특정 버전에 무엇이 존재하고 무엇이 존재하지 않는지 걱정할 필요 없이 디렉터리를 이동하고 해당 폴더에 있는 모든 키 파일을 로드할 수 있습니다.

개인 구성에 키가 로드되어 있을 수 있으므로 프론트엔드 코드에 개인 구성을 로드하고 싶지 않습니다.프런트 엔드 코드베이스를 백엔드에서 완전히 분리하는 것이 더 이상적일 수 있지만, 대부분의 경우 PITA는 사람들이 이를 수행하는 것을 막을 수 있을 정도로 큰 장벽입니다. 즉, 비공개 구성과 공개 구성입니다.하지만 프런트 엔드에서 개인 구성이 로드되지 않도록 하기 위해 두 가지 작업을 수행합니다.

  1. 프런트 엔드 번들에 개인 구성에 있는 비밀 키 중 하나가 포함되어 있지 않은지 확인하는 장치 테스트가 있습니다.
  2. 프론트엔드 코드가 백엔드 코드와 다른 폴더에 있고 "config.js"라는 이름의 두 개의 서로 다른 파일이 있습니다. 각 파일마다 하나씩 있습니다.백엔드의 경우 config.js가 개인 구성을 로드하고 프런트엔드의 경우 공용 구성을 로드합니다.그러면 항상 ('config')만 필요로 하고 어디서 왔는지 걱정하지 않아도 됩니다.

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

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

Konfigrepo의 예:

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

다음과 같은 이름의 구성 파일로 폴더를 생성합니다.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');
    }
});

그냥 사용하기npmconfig 다운로드 )(300,000 다운로드)

https://www.npmjs.com/package/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

조금 늦었지만(단 10년), 저는 a를 사용합니다.config.js구조는 다음과 같습니다.

const env = process.env.NODE_ENV || 'development';

var config_temp = {
    default:{
        port: 3000,
        mysql_host: "localhost",
        logging_level: 5,
        secret_api_key: process.env.SECRET_API_KEY
    },
    development: {
        logging_level: 10
    },
    production: {
        port: 3001,
        mysql_host: "not-localhost"
    }
};
var config = {
    ...config_temp.default, 
    ...config_temp[env]
}
module.exports = config;

구성을 로드하는 경우:

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

다음과 같은 방법으로:

  • .env는 변가포있다에 .config.js추악함을 수 : 이추함피수있파일는:require('./config')[process.env.NODE_ENV || 'development'].
  • »config.js해서 민한변계처속리때기코문레에드업으로 처리되기 할 수 .process.env.
  • 두 가지 모두에 동일한 요소가 포함된 경우default:{그리고.custom_env:{두 번째만 유지됩니다.
  • 전용 폴더 및 여러 파일이 없습니다(구성 등).

저는 이것이 정말 오래된 게시물이라는 것을 압니다.하지만 환경 변수를 구성하기 위한 모듈을 공유하고 싶습니다. 매우 유연한 솔루션이라고 생각합니다.여기 모듈 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사용자 환경에 대한 모든 변수를 가져옵니다.

'개발' 구성과 '운영' 구성을 분리하는 것이 좋습니다.

다음 방법을 사용합니다.다음은 내 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;

저는 게임에 조금 늦었지만, 제가 필요로 하는 것을 여기나 다른 곳에서 찾을 수 없어서 제가 직접 무언가를 썼습니다.

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

  1. 프론트 엔드를 지원합니다.프론트 엔드에서 구성을 사용할 수 없는 경우에는 무엇을 해야 합니까?
  2. 지다settings-overrides.js하게 보이지만 하보재구수있지에서 할 수 .settings.js코드를 변경하지 않고 구성을 쉽게 수정할 수 있습니다.저는 그것이 saas에 유용하다고 생각합니다.

지원 환경에는 관심이 없지만 솔루션에 쉽게 추가할 수 있는 방법을 설명합니다.

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는 " 는▁which▁to"를 대상으로 재정의 파일입니다.conf/dev는 my vcs에서 무시됩니다.
  • publicConfiguration전면 및 후면에서 볼 수 있습니다.
  • privateConfiguration백엔드에서만 볼 수 있습니다.
  • sendPublicConfiguration공개 구성을 노출하고 전역 변수에 할당하는 경로입니다.예를 들어 아래 코드는 프런트엔드에서 공용 구성을 글로벌 변수 myConf로 표시합니다. 이름인 " 기적으글변이사용다니합을름수로벌로본"를 합니다.conf.

    app.get/get/sys/conf", required "conf").공개 구성 전송);

재지정 논리

  • privateConfiguration이 publicConfiguration 및 meConf와 병합됩니다.
  • 공용 구성은 각 키에 재정의가 있는지 확인하고 해당 재정의를 사용합니다.이런 식으로 우리는 어떤 사적인 것도 노출시키지 않을 것입니다.

환경 지원 추가

제가 "환경 지원"이 유용하다고 생각하지 않더라도, 누군가는 그럴지도 모릅니다.

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

if (환경 == "운영") {meConf = required(".../conf/dev/meConf"). 운영; }

if (환경 == "개발") {meConf = required(".../conf/dev/meConf"), 개발; }

마찬가지로 환경별로 파일을 보유할 수 있습니다.

 meConf.development.js
 meConf.production.js

올바른 항목을 가져옵니다.나머지 논리는 그대로 유지됩니다.

일반적인 .json 파일보다 더 많은 유연성을 원하지만 의존성이 필요한 라이브러리로 추상화되는 것을 원하지 않았기 때문에 사용한 alt 예제입니다.기본적으로 내가 원하는 값을 설정한 개체를 반환하는 함수를 즉시 내보냅니다.많은 유연성을 제공합니다.

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

여기에 완전한 예를 들어 훨씬 더 나은 설명이 있습니다.Node.js의 구성 파일 사용

npm i config

In config/default.json
{
    "app": {
        "port": 3000
    },
    "db": {
        "port": 27017,
        "name": "dev_db_name"
    }
}

In config/production.json
{
    "app": {
        "port": 4000
    },
    "db": {
        "port": 27000,
        "name": "prod_db_name"
    }
}

In index.js

const config = require('config');

let appPort = config.get('app.port');
console.log(`Application port: ${appPort}`);

let dbPort = config.get('db.port');
console.log(`Database port: ${dbPort}`);

let dbName = config.get('db.name');
console.log(`Database name: ${dbName}`);

console.log('NODE_ENV: ' + config.util.getEnv('NODE_ENV'));

$ node index.js
Application port: 3000
Database port: 27017
Database name: dev_db_name
NODE_ENV: development

For production
$ set NODE_ENV=production
$ node index.js
Application port: 4000
Database port: 27000
Database name: prod_db_name
NODE_ENV: production

답변에 언급nconf 모듈과 이 답변에 언급된 node-config 외에도 더 단순한 .ini 구성 파일 파서로 보이는 node-iniparser와 IniReader도 있습니다.

여기기사에서 영감을 얻은 깔끔한 접근법이 있습니다.유비쿼터스 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"
  }
}

그리고 개발.json like so.

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

네가 한다면.config = require('./config')입니다.

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

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

최근에 모든 유형의 구성 파일을 로드할 수 있는 작은 모듈을 릴리스했습니다.매우 간단합니다. https://github.com/flesler/config-node 에서 확인할 수 있습니다.

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

}

구성 관리를 위해 Dotenv-Flow를 사용했습니다.

이것은 예상대로 작동하고 있습니다.로컬, 개발, 스테이징 및 프로덕션과 같은 여러 환경이 있는 경우가 많습니다.이러한 단계를 통해 자체 환경을 생성할 수 있습니다.

npm i dotenv-flow.

다음과 같은 파일 만들기.env | .env.dev | .env.prod.

테스트 목적으로 이 컨텐츠를 복사

.env

DATABASE_HOST=global
DATABASE_PORT=global
DATABASE_USER=global
DATABASE_PASS=global
DATABASE_NAME=global

.env.dev

DATABASE_NAME=dev
DATABASE_PASS=dev

.env.prod

DATABASE_NAME=prod
DATABASE_PASS=prod

이제 이러한 환경 변수를 사용하여 테스트 파일을 만듭니다.

test.js

console.log('database host:', process.env.DATABASE_HOST);
console.log('database port:', process.env.DATABASE_PORT);
console.log('database user:', process.env.DATABASE_USER);
console.log('database pass:', process.env.DATABASE_PASS);
console.log('database name:', process.env.DATABASE_NAME);

이제 다음 명령을 사용하여 스크립트를 실행합니다.

node -r dotenv-flow/config test.js
node -r dotenv-flow/config test.js --node-env=dev
node -r dotenv-flow/config test.js --node-env=prod

이러한 환경 변수 파일을 특정 폴더에 생성한 경우(예: 저의 경우 envs 폴더에 생성한 경우) 다음 명령을 사용합니다.

node -r dotenv-flow/config test.js --dotenv-flow-path=./envs
node -r dotenv-flow/config test.js --dotenv-flow-path=./envs --node-env=dev
node -r dotenv-flow/config test.js --dotenv-flow-path=./envs --node-env=prod

이 오래된 스레드를 방문하는 사람들을 위해 여기 제가 좋은 패키지가 있습니다.

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

여기서 몇 가지 제안된 해결책을 시도해 보았지만, 만족스럽지 못해서 저만의 모듈을 만들었습니다.은 라고합니다라고 .mikro-config그리고 가장 큰 차이점은 구성보다 관습을 존중한다는 것입니다. 따라서 모듈을 필요로 하고 사용을 시작할 수 있습니다.

"" "js" "json" "json"의 합니다./config폴더를 누릅니다.먼저 로딩됩니다.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

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

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

TypeScript를 사용한 방법.

export const loadConfig = () => {
    const configLoadeded = configLoader.util.toObject() as any
    Config = configLoadeded
}

export interface ConfigI {
    productName: string;
    productId: string;
    googleCloudApiKey: string;
}

할 때 하지 않는 . 하는 것이 더입니다. 배포 환경을 단일 환경 변수로 설정하는 것이 더 쉽기 때문입니다.DB_CONNECTION예를 들어, 필요에 따라 추가 구성 데이터를 전달합니다.

구성 데이터 예:

const config = {
    userIds: [1, 2, 3],
    serviceLimit: 100,
    // etc., configuration data of any complexity    
};
// or you can read it from a config file

데이터베이스 드라이버가 신경 쓰지 않는 추가 매개 변수를 사용하여 연결 문자열을 만듭니다.

import {ConnectionString} from 'connection-string';

const cs = new ConnectionString('postgres://localhost@dbname', {
    user: 'user-name',
    password: 'my-password',
    params: {
        config
    }  ​
});

그런 다음 환경에 저장할 문자열을 생성할 수 있습니다.

cs.toString();
//=>postgres://localhost:my-password@dbname?config=%7B%22userIds%22%3A%5B1%2C2%2C3%5D%2C%22serviceLimit%22%3A100%7D

환경에 를 들어, 이를환저면하장에경,▁so이하면.DB_CONNECTION그리고 고객 프로세스 내에서 당신은 그것을 읽을 수 있습니다.process.env.DB_CONNECTION:

const cs = new ConnectionString(process.env.DB_CONNECTION);

const config = JSON.parse(cs.params?.config); // parse extra configuration
//=> { userIds: [ 1, 2, 3 ], serviceLimit: 100 }

이렇게 하면 단일 환경 변수 내에서 연결과 필요한 추가 구성을 모두 사용할 수 있으므로 구성 파일을 조작할 필요가 없습니다.

사용해 보십시오.properties-gen https://www.npmjs.com/package/://www.npmjs.com/package/properties-gen

와 상당히 유사합니다.node-config설정한 환경에 따라 구성 기본 파일을 로드하고 확장 파일을 확장하지만 이는 필요에 따라 실행되며 완전히 구성할 수 있는 CLI입니다.

npx properties-gen init

CLI 구성을 생성하려면 프로젝트에 설치합니다.

npm install properties-gen --save-dev

파일 및을하고 "" (" " " " " " " " " 를 실행합니다.generate명령을 빌드 프로세스 전에 또는 프로젝트에서 개발 서버를 시작하기 전에 실행합니다.

{
  "name": "myApp",
  "scripts": {
    "config": "properties-gen generate",
    "dev": "npm run config && next dev",
    "build": "npm run config && next build",
    "start": "next start"
  }
}

한 가지 멋진 점은 클라이언트 및 서버 관련 파일과 같이 여러 출력을 생성해야 하는 경우를 대비하여 여러 구성 그룹을 정의할 수 있다는 것입니다.

언급URL : https://stackoverflow.com/questions/5869216/how-to-store-node-js-deployment-settings-configuration-files