কিভাবে Node.js স্থাপনার সেটিংস/কনফিগারেশন ফাইল সংরক্ষণ করবেন?




configuration-files (16)

আমি কয়েকটি নোড অ্যাপ্লিকেশানগুলিতে কাজ করেছি, এবং আমি স্থাপনার-সম্পর্কিত সেটিংস সংরক্ষণের একটি ভাল প্যাটার্ন খুঁজছি। Django জগতে (যেখানে আমি থেকে আসি), সাধারণ অনুশীলনের একটি মান সেটিংস (টাইমজোন, ইত্যাদি), এবং তারপরে local_settings.py settings.py স্থাপনার জন্য নির্দিষ্ট সেটিংস, যেমন। কি ডাটাবেস কথা বলতে, কি memcache সকেট, অ্যাডমিন জন্য ই-মেইল ঠিকানা এবং তাই।

আমি নোডের জন্য অনুরূপ নিদর্শন খুঁজছেন হয়েছে। শুধু একটি কনফিগার ফাইলটি সুন্দর হবে, তাই এটি app.js অন্য সব কিছু দিয়ে app.js করতে হবে না, তবে একটি উৎসের মধ্যে সার্ভার-নির্দিষ্ট কনফিগারেশন করার উপায় থাকা app.js এটি আমার কাছে গুরুত্বপূর্ণ মনে করে যা সোর্স নিয়ন্ত্রণে নেই। একই অ্যাপ্লিকেশনটি বিভিন্ন সার্ভারগুলিতে বন্যভাবে বিভিন্ন সেটিংস জুড়ে স্থাপন করা যেতে পারে এবং মজাদার দ্বন্দ্বগুলি এবং যেগুলি আমার মজার ধারণা নয় তা মোকাবেলা করতে পারে।

তাই এই জন্য ফ্রেমওয়ার্ক / টুল কোন ধরনের আছে, নাকি সবাই নিজের সাথে একসাথে কিছু হ্যাক করে?


অনেক পরে, আমি কনফিগারেশন পরিচালনার জন্য একটি চমত্কার ভাল 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 ফ্রেমওয়ার্ক উদ্যোগের অংশ হিসাবে আরও ভালভাবে সম্মানিত নোড.জেএস দোকানে, Nodejitsu দ্বারাও সমর্থিত, তাই এটি হওয়া উচিত মোটামুটি ভবিষ্যত-প্রমাণ।

nconf দেখুন।


আপনি dotenv যা বারো-ফ্যাক্টর অ্যাপ্লিকেশনের নীতি অনুসরণ করে।

আমি নোড-কনফিগার ব্যবহার করতে ব্যবহৃত, কিন্তু যে কারণে dotenv তৈরি। এটি সম্পূর্ণরূপে রুবি এর dotenv লাইব্রেরি দ্বারা অনুপ্রাণিত ছিল।

ব্যবহার বেশ সহজ:

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

তারপরে আপনি কেবল একটি .env ফাইল তৈরি করুন এবং এভাবে আপনার সেটিংস রাখুন:

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

যে dotenv জন্য dotenv এর।


আপনি আপনার স্ক্রিপ্ট (env ইত্যাদি) শুরু করতে npm ব্যবহার করছেন?

আপনি যদি .env ফাইলগুলি ব্যবহার করেন তবে আপনি তাদের package.json এ অন্তর্ভুক্ত করতে পারেন এবং উৎস থেকে package.json ব্যবহার করতে পারেন / তাদের শুরু করতে পারেন।

উদাহরণ:

{
  "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 এরিক এলিয়টের সমস্ত ক্রেডিট


আপনি নোড v0.5.x হিসাবে JSON ফাইল প্রয়োজন ( এই উত্তর উল্লেখ করা )

config.json:

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

app.js:

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

আপনি পরিবেশ নির্দিষ্ট কনফিগারেশন ফাইলের জন্য Konfig ব্যবহার করতে পারেন। এটি স্বয়ংক্রিয়ভাবে জসন বা yaml কনফিগারেশন ফাইল লোড করে, এটি ডিফল্ট মান এবং গতিশীল কনফিগারেশন বৈশিষ্ট্য রয়েছে।

কনফিগ রেপো থেকে একটি উদাহরণ:

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

আরো বিস্তারিত: Konfig


আমার সমাধান মোটামুটি সহজ:

পরিবেশ কনফিগ লোড করুন ./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

এখানে আরও বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে: http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/


আমি আমার প্যাকেজের জন্য package.json ব্যবহার করি এবং আমার কনফিগারেশনের জন্য 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 করতে npm install করি। here যে আরো তথ্য।

প্রকল্প আমার উত্পাদন সার্ভারের জন্য remotes সঙ্গে, GitHub মধ্যে সংরক্ষিত হয়।


আমি এই সত্যিই একটি পুরানো পোস্ট জানি। কিন্তু আমি পরিবেশের ভেরিয়েবল কনফিগার করার জন্য আমার মডিউল ভাগ করতে চাই, মনে হয় এটি খুব নমনীয় সমাধান। এখানে মডিউল 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 ব্যবহার করতে পারেন।


আমি এখানে প্রস্তাবিত কিছু সমাধান চেষ্টা করেছি, কিন্তু তাদের সাথে সন্তুষ্ট ছিলাম না, তাই আমি নিজের মডিউল তৈরি করেছি। এটি mikro-config বলা হয় এবং প্রধান পার্থক্য এটি কনফিগারেশনের উপর কনভেনশনকে সম্মান করে, তাই আপনি কেবল মডিউল প্রয়োজন এবং এটি ব্যবহার করা শুরু করতে পারেন।

আপনি /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


আমি খেলাটি একটু দেরি করে ফেলেছি, কিন্তু আমি এখানে যা প্রয়োজন তা খুঁজে পাচ্ছি না- অন্য কোথাও - তাই আমি নিজেকে কিছু লিখলাম।

একটি কনফিগারেশন প্রক্রিয়া জন্য আমার প্রয়োজনীয়তা নিম্নলিখিত:

  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 ফাইলগুলি যা conf/dev meConf এ লক্ষ্য করা যায় - যা আমার ভিএসএস দ্বারা উপেক্ষা করা হয়।
  • publicConfiguration - সামনে শেষ এবং ব্যাক শেষ থেকে দৃশ্যমান হবে।
  • privateConfiguration - শুধুমাত্র ব্যাক শেষ থেকে দৃশ্যমান হবে।
  • sendPublicConfiguration করুন পাবলিক কনফিগারেশন - একটি রুট যা জনসাধারণের কনফিগারেশন প্রকাশ করে এবং এটি একটি বিশ্বব্যাপী পরিবর্তনশীলকে বরাদ্দ করবে। উদাহরণস্বরূপ নীচের কোডটি সার্বজনীন কনফিগারেশন হিসাবে বিশ্বব্যাপী পরিবর্তনশীল MyConf সামনে প্রান্তে প্রকাশ করবে। ডিফল্টরূপে এটি বিশ্বব্যাপী পরিবর্তনশীল নাম conf

    app.get ("/ ব্যাকএন্ড / কন", প্রয়োজন ("conf")। পাবলিকপনফিগিকেশন পাঠান);

Overrides যুক্তি

  • ব্যক্তিগত কনফিগারেশন পাবলিক কনফিগারেশন এবং তারপর আমার সাথে মিলিত হয়।
  • পাবলিক কনফিগারেশন যদি ওভাররাইড থাকে তবে প্রতিটি কী পরীক্ষা করে এবং ওভাররাইড ব্যবহার করে। এই ভাবে আমরা ব্যক্তিগত কিছু প্রকাশ করা হয় না।

পরিবেশ সমর্থন যোগ করা হচ্ছে

যদিও আমি একটি "পরিবেশ সমর্থন" খুঁজে পাই না, সম্ভবত কেউ হবে।

পরিবেশ সমর্থন যোগ করার জন্য আপনাকে আমার এই পরিবর্তনটি (সিউডোকোড)

যদি (পরিবেশ == "উত্পাদন") {meConf = প্রয়োজন ("../ conf / dev / meconf")। উত্পাদন; }

যদি (পরিবেশ == "উন্নয়ন") {meConf = প্রয়োজন ("../ conf / dev / meconf")। উন্নয়ন; }

একইভাবে আপনি পরিবেশ প্রতি একটি ফাইল থাকতে পারে

 meConf.development.js
 meConf.production.js

এবং সঠিক এক আমদানি। যুক্তি বাকি একই থাকে।


একটি সর্বদাই উদাহরণ আমি ব্যবহার করেছি কারণ আমি একটি সাধারণ। জসন ফাইলের চেয়ে আরও নমনীয়তা চেয়েছিলাম কিন্তু এটি একটি লাইব্রেরিতে সরানো না চাইলে নির্ভরতা প্রয়োজন হবে। মূলত, একটি ফাংশন এক্সপোর্ট করা অবিলম্বে যা একটি বস্তু সেট মান আমি চেয়েছিলেন ফিরে। অনেক নমনীয়তা দেয়।

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

এখানে পুরো উদাহরণ সঙ্গে অনেক ভাল ব্যাখ্যা আছে। Node.js মধ্যে কনফিগ ফাইল ব্যবহার করে


এখানে যারা এই পুরানো থ্রেড পরিদর্শন করছে তাদের জন্য একটি প্যাকেজ যা আমি ভাল বলে মনে করি।

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


শুধু exports সঙ্গে একটি সহজ settings.js করবেন:

exports.my_password = 'value'

তারপর, আপনার স্ক্রিপ্টে, একটি require :

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

আপনার সমস্ত সেটিংস এখন settings পরিবর্তনশীল মাধ্যমে availabe হবে:

settings.my_password // 'value'

শুধু npm মডিউল config ব্যবহার করুন (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

Convict একটি বৈধতা জন্য একটি স্কিমা যোগ করে যে অন্য বিকল্প। এনকোফের মত, এটি পরিবেশ ভেরিয়েবল, আর্গুমেন্ট, ফাইল এবং জসন বস্তুর যেকোনো সমন্বয় থেকে লোডিং সেটিংসকে সমর্থন করে।

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

শুরু নিবন্ধটি: নোড-দোষী সাব্যস্ত সঙ্গে কনফিগারেশন Taming


'উন্নয়ন' এবং 'উত্পাদন' কনফিগারগুলি আলাদা করা ভাল।

আমি নিম্নলিখিত পদ্ধতি ব্যবহার করি: এখানে আমার কনফিগারেশন / 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;




configuration-files