নোড.জেএস-এ পরিবেশনা নির্দিষ্ট কনফিগারগুলি সেটআপ করা হচ্ছে প্রত্যেকের সাথে ব্যবহার করতে


117

আমি নোড.জেএস + এক্সপ্রেস.জেএস + Everyauth.js ব্যবহার করছি। আমি আমার সমস্ত প্রত্যয় যুক্তিকে মডিউল ফাইলে স্থানান্তরিত করেছি

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

এর ভিতরে আমি কী / গোপন সংমিশ্রণগুলি দিয়ে আমার oAuth কনফিগারেশন ফাইলটি লোড করি:

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

এই কোডগুলি বিভিন্ন পরিবেশের জন্য আলাদা - কলব্যাকগুলি বিভিন্ন ইউআরএল হিসাবে বিকাশ / মঞ্চায়ন / উত্পাদন।

ক্যু। সমস্ত মডিউল দিয়ে ফিল্টার করতে আমি কীভাবে এটি পরিবেশগত কনফিগারেশনে সেট করব বা আমি সরাসরি মডিউলটিতে প্রবেশ করতে পারি?

এনভিউতে সেট করুন:

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

? আশা করি তা বোধগম্য হয়


আমি এমন একটি সমাধান পেয়েছি যা নীচে থেকে কিছু ধারণাগুলি ব্যবহার করে মডিউল = ফাংশন না করে আমি কোনও প্রসেস.এনভি.এন.ডি.এন.ভি.ভি. মূল্যায়ন করতে পারি এবং পরিবেশের জন্য সঠিক বস্তুটি ফিরিয়ে আনতে পারি। একটু অগোছালো তবে কাজ করে works
অ্যান্ডি t

নির্লজ্জ স্ব-প্রচার প্রচার করুন, তবে আমি নোড.জেএস এর জন্য একটি মডিউল লিখেছি যা এটি পৃথক ফাইল এবং একটি কমান্ড-লাইন সুইচের মাধ্যমে করবে: নোড-কনফিগার
র্যান্ডলফো

উত্তর:


192

আমার সমাধান,

অ্যাপ্লিকেশন ব্যবহার করে লোড করুন

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

তারপরে জ্যানস সলিউশন অনুসারে ফাইলটি লোড করুন এবং একটি নতুন উদাহরণ তৈরি করুন যা আমরা প্রয়োজনে একটি মানকে পাস করতে পারি, এই ক্ষেত্রে process.env.NODE_ENVবিশ্বব্যাপী তাই প্রয়োজন নেই needed

var Config = require('./conf'),
    conf = new Config();

তারপরে আমরা কনফিগার অবজেক্টের বৈশিষ্ট্যগুলি ঠিক আগের মতোই অ্যাক্সেস করতে পারি

conf.twitter.consumerKey

2
আপনি এখানে নতুন ব্যবহার করছেন কেন?
নীলহল্লু

5
আমি দ্বিতীয় @ ব্লুহেল্লু। Is newপ্রয়োজনীয়?
সুং চো

2
উইন্ডোজ সমতুল্য হবে সেট NODE_ENV = বিকাশ
মুজফফার

3
পরিবর্তে না new। আমি config.js....Config = function(){...}; module.exports = Config()
অতু

আমার যদি 50 টি ওয়েব সার্ভার থাকে তবে এই ক্ষেত্রে প্রতিটি সার্ভারে ম্যানুয়ালি স্ক্রিপ্টটি শুরু করতে অসুবিধা হবে
রাজেশ

60

আপনার কাছে শীর্ষ স্তরের হিসাবে NODE_ENV সহ একটি JSON ফাইলও থাকতে পারে। আইএমও, কনফিগারেশন সেটিংস প্রকাশ করার জন্য এটি সর্বোত্তম উপায় (সেটিংস ফেরত স্ক্রিপ্ট ব্যবহারের বিপরীতে)।

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

হাই, আপনি কেন দয়া করে কনফিগারেশন সেটিংস প্রকাশ করার জন্য এটি সর্বোত্তম উপায় বলে ব্যাখ্যা করতে পারেন (সেটিংস ফেরত স্ক্রিপ্ট ব্যবহারের বিপরীতে)। ?
ভেঙ্কট কোটরা

14
আমার ধারণা এটি খুব বেশি পার্থক্য করে না। মানসিকভাবে, আমি যখন জেএসএনকে দেখি যখন আমি কোনও জেএস ফাইল দেখি তখন 'স্থিতিশীল ডেটা' বনাম ভাবি, আমার মনে হয় এর ভিতরে কিছু যুক্তি রয়েছে। এছাড়াও .json প্রকার ব্যবহারের আরেকটি সুবিধা হ'ল অন্যান্য ভাষাও একই ফাইলটি আমদানি করতে পারে।
ম্যাটওয়াদ

1
@ ভেনক্যাটকত্রা কনফিগারেশনটিকে সাধারণত স্থিতিশীল বলে বিবেচনা করা হয়, এবং তাই জেসন, ইয়ামল, ইনি ইত্যাদির মতো বিষয়গুলির সাথে সর্বাধিকরূপে সর্বোত্তমভাবে প্রকাশিত হয়েছিল, এমন একটি স্ক্রিপ্ট যা সেই রাজ্যকে দেয়, বাছাই করে বোঝায় যে কিছু গতিশীল হচ্ছে যা খারাপ হবে।
সর্বাধিক

9
সচেতন হন যে এই পদ্ধতিটি উত্স নিয়ন্ত্রণে শংসাপত্রগুলি প্রকাশ করে।
পিয়ের-লুক জেনড্রেও

আমি মঞ্চায়ন এবং উত্পাদন জন্য বিভিন্ন ইউআরএল তৈরি করতে পারি?
অ্যালেক্স

34

একটি খুব দরকারী সমাধান কনফিগার মডিউল ব্যবহার করা হয় ।

মডিউল ইনস্টল করার পরে:

$ npm install config

আপনি একটি ডিফল্ট.জোন কনফিগারেশন ফাইল তৈরি করতে পারেন । (আপনি JSON বা জেএস অবজেক্ট এক্সটেনশন .json5 ব্যবহার করে ব্যবহার করতে পারেন)

উদাহরণ স্বরূপ

$ vi config/default.json

{
  "name": "My App Name",
  "configPath": "/my/default/path",
  "port": 3000
}

এই ডিফল্ট কনফিগারেশন পরিবেশের কনফিগারেশন ফাইল বা স্থানীয় বিকাশের পরিবেশের জন্য একটি স্থানীয় কনফিগারেশন ফাইল দ্বারা ওভাররাইড করা যেতে পারে:

product.json হতে পারে:

{
  "configPath": "/my/production/path",
  "port": 8080
}

উন্নয়ন.জসন হতে পারে:

{
  "configPath": "/my/development/path",
  "port": 8081
}

আপনার স্থানীয় পিসিতে আপনার একটি লোকাল.জসন থাকতে পারে যা সমস্ত পরিবেশকে ওভাররাইড করে অথবা স্থানীয়-প্রোডাকশন.জসন বা স্থানীয়- উন্নয়ন.জসন হিসাবে আপনার একটি নির্দিষ্ট স্থানীয় কনফিগারেশন থাকতে পারে ।

লোড অর্ডার সম্পূর্ণ তালিকা

আপনার অ্যাপের অভ্যন্তরে

আপনার অ্যাপ্লিকেশনটিতে আপনাকে কেবল কনফিগারেশন এবং প্রয়োজনীয় বৈশিষ্ট্য প্রয়োজন।

var conf = require('config'); // it loads the right file
var login = require('./lib/everyauthLogin', {configPath: conf.get('configPath'));

অ্যাপটি লোড করুন

অ্যাপটি ব্যবহার করে লোড করুন:

NODE_ENV=production node app.js

বা চিরকাল বা pm2 এর সাথে সঠিক পরিবেশ নির্ধারণ করা

চিরতরে:

NODE_ENV=production forever [flags] start app.js [app_flags]

পিএম 2 (শেলের মাধ্যমে):

export NODE_ENV=staging
pm2 start app.js

পিএম 2 (জাজসনের মাধ্যমে):

process.json

{
   "apps" : [{
    "name": "My App",
    "script": "worker.js",
    "env": {
      "NODE_ENV": "development",
    },
    "env_production" : {
       "NODE_ENV": "production"
    }
  }]
}

এবং তারপর

$ pm2 start process.json --env production

এই সমাধানটি খুব পরিষ্কার এবং এটি উত্পাদন / মঞ্চায়ন / বিকাশ পরিবেশ এবং স্থানীয় সেটিংয়ের জন্য পৃথক কনফিগার ফাইলগুলি সহজ সেট করে।


এনপিএম ইনস্টল কনফিগারেশন - সেভ, ভাল না?
স্ট্যাকডেভ

14

সংক্ষেপে

এই ধরণের একটি সেটআপ সহজ এবং মার্জিত:

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-en वातावरण/ , এটি পরীক্ষা করে দেখুন আরো বিস্তারিত.


5

পরিবেশের সাথে অ্যাপ্লিকেশন শুরু করার সময় আমরা যেভাবে এটি করি তা হল argument এই ক্ষেত্রে:

node app.js -c dev

অ্যাপ.জেজেস এর পরে আমরা 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);

আমি বরং সমস্ত যুক্তি অ্যাপ্লিকেশন.জেএস app.configure('developmentকোডের অভ্যন্তরেই রেখে দেব , তবে আমি এই সমাধানটি এইটির সাহায্যে ব্যবহার করতে পারি কিনা তা দেখার চেষ্টা করতে হবে
অ্যান্ডি t

এই উত্তরের আপডেট করুন: আর্কিটেক্ট একটি নির্ভরতা পরিচালনার কাঠামো যা এটি একদম সুন্দর উপায়ে সমাধান করে।
জান জংবুম

5

একটি মার্জিত উপায় হ'ল .envস্থানীয়ভাবে উত্পাদন সেটিংসকে ওভাররাইড করতে ফাইল ব্যবহার করা। কমান্ড লাইন সুইচগুলির প্রয়োজন নেই। কোনও config.jsonফাইলের সমস্ত কমা এবং বন্ধনীগুলির প্রয়োজন নেই । আমার উত্তর এখানে দেখুন

উদাহরণ: আমার মেশিনে .envফাইলটি হ'ল:

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

আমার স্থানীয় .envকোনও পরিবেশের ভেরিয়েবলকে ওভাররাইড করে। কিন্তু উপস্থাপনকারী বা উৎপাদন সার্ভারে এনভায়রনমেন্ট ভেরিয়েবল ধাপে আগে থেকে সেট করা হয় (তারা হয়তো heroku.com আছি) NODE_ENV=stageবা উৎপাদন NODE_ENV=prod


4

স্থাপনার সার্ভারে পরিবেশের পরিবর্তনশীল সেট করুন (যেমন: NODE_ENV = উত্পাদনের মতো)। আপনি 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;

বেস সমস্ত পরিবেশের জন্য সাধারণ কনফিগারেশন থাকে।

তারপরে অন্যান্য মডিউলগুলিতে আমদানি করুন

const config =  require('path/to/config.js')
console.log(config.port)

শুভ কোডিং ...


3

নোডেজ-কনফিগার মডিউল সহ আরও মার্জিত উপায়ে এটি কীভাবে করা যায়

এই মডিউলটি আপনার কম্পিউটারের নামের উপর ভিত্তি করে কনফিগারেশন পরিবেশ সেট করতে সক্ষম। এর পরে যখন আপনি একটি কনফিগারেশনের অনুরোধ করবেন আপনি পরিবেশের জন্য নির্দিষ্ট মান পাবেন।

উদাহরণস্বরূপ ধরুন আপনার পিসি 1 এবং পিসি 2 নামক দুটি ডেভলপমেন্ট মেশিন এবং পিসি 3 নামের একটি উত্পাদন মেশিন রয়েছে lets যখনই আপনি আপনার কোডটিতে পিসি 1 বা পিসি 2 তে কনফিগারেশন মানগুলির জন্য অনুরোধ করবেন তখন আপনাকে অবশ্যই "বিকাশ" পরিবেশের কনফিগারেশন এবং পিসি 3 এ আপনাকে অবশ্যই "উত্পাদন" পরিবেশের কনফিগারেশন পেতে হবে। এটি এভাবে অর্জন করা যায়:

  1. কনফিগারেশন ডিরেক্টরিতে একটি বেস কনফিগারেশন ফাইল তৈরি করুন, "app.json" বলুন এবং এটিতে প্রয়োজনীয় কনফিগারেশন যুক্ত করুন।
  2. এই ক্ষেত্রে "বিকাশ" এবং "উত্পাদন" এর ক্ষেত্রে আপনার পরিবেশের নামের সাথে মেলে এমন কনফিগারেশন ডিরেক্টরিতে কেবল ফোল্ডার তৈরি করুন।
  3. এরপরে, কনফিগারেশন ফাইলগুলি আপনি ওভাররাইড করতে চান এবং পরিবেশের ডিরেক্টরিতে প্রতিটি পরিবেশের জন্য বিকল্পগুলি নির্দিষ্ট করতে চান (লক্ষ্য করুন যে বেস কনফিগারেশন ফাইলে থাকা প্রতিটি অপশন আপনাকে নির্দিষ্ট করতে হবে না, তবে কেবলমাত্র অপশনগুলি আপনি ওভাররাইড করতে চান The পরিবেশ কনফিগারেশন ফাইলগুলি বেস ফাইলগুলিতে "ক্যাসকেড" করবে))

এখন নিম্নলিখিত সিনট্যাক্স সহ নতুন কনফিগারেশন উদাহরণ তৈরি করুন।

var config = require('nodejs-config')(
   __dirname,  // an absolute path to your applications 'config' directory
   {
      development: ["pc1", "pc2"],
      production: ["pc3"],

   }
);

পরিবেশের বিষয়ে চিন্তা না করে এখন আপনি যে কোনও কনফিগারেশন মান পেতে পারেন:

config.get('app').configurationKey;

0

এই উত্তরটি নতুন কিছু নয়। এটি @ এবং_অ্যান্ডি_-র উল্লিখিত মতামতের মতো। তবে আমি নীচের প্যাটার্নটি দুটি কারণে ব্যবহার করি।

  1. কোনও বাহ্যিক এনএমপি নির্ভরতা না দিয়ে পরিষ্কার বাস্তবায়ন

  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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.