2012-01-15 5 views
9

के लिए विभिन्न चर सेट अप करने के लिए मैं एक्सप्रेस का उपयोग कर रहा हूं और मुझे प्रत्येक सर्वर (स्टेजिंग और उत्पादन) के लिए अलग-अलग प्रमाण-पत्रों का उपयोग करने की आवश्यकता है।Node.js: प्रोड और स्टेजिंग

मैं server.coffee फ़ाइल में चर सेट कर सकता हूं लेकिन फिर मुझे विभिन्न फ़ाइलों में उन चरों तक पहुंचने की आवश्यकता होगी।

server.coffee: 

app.configure 'production',() -> 
app.use express.errorHandler() 

समाधान क्या है? चर सेट अप करें और फिर उन्हें निर्यात करें?

उत्तर

1

यदि आप यह निर्धारित करने के लिए तर्क नहीं चाहते हैं कि प्रत्येक फ़ाइल में कौन सी कॉन्फ़िगरेशन का उपयोग करना है (जो बहुत बदसूरत लगेगा), तो आपको इसे कहीं भी निर्यात करना होगा।

मैं क्या सुझाव दूंगा: config.json फ़ाइल में अलग-अलग कॉन्फ़िगरेशन हैं। मुख्य फ़ाइल को इसकी आवश्यकता होती है और config.default = config.(condition ? 'production':'development') जैसी कुछ करता है। अन्य सभी फाइलों में, अब आप require('./config').default कर सकते हैं।

1

मेरे पास एक ऐप है जो पर्यावरण (उत्पादन = पर्यावरण चर, स्टेजिंग = कमांड लाइन तर्क; स्थानीय = कॉन्फ़िगरेशन फ़ाइलों) के आधार पर कॉन्फ़िगरेशन चर (uris, api कुंजी, प्रमाण-पत्र इत्यादि) घोषित करने के तीन अलग-अलग तरीकों का उपयोग करता है। मुझे लगता है कि मैं अपने अनुप्रयोग में उपयोग कर सकते हैं एक वस्तु में इन विकल्पों में से सभी के विलय को संभालने के लिए एक छोटे से "config" मॉड्यूल में लिखा था और एक सार रूप में अपलोड किया: https://gist.github.com/1616583

यह सबसे अच्छा कार्यान्वयन नहीं हो सकता है, लेकिन यह काम कर रहा है अभी तक बहुत अच्छी तरह से :)।

19

./config.js

var development = { 
    appAddress : '127.0.0.1:3000', 
    socketPort : 4000, 
    socketHost : '127.0.0.1', 
    env : global.process.env.NODE_ENV || 'development' 
}; 

var production = { 
    appAddress : 'someDomain.com', 
    socketPort : 4000, 
    socketHost : '8.8.8.8', 
    env : global.process.env.NODE_ENV || 'production' 
}; 

exports.Config = global.process.env.NODE_ENV === 'production' ? production : development; 

./app.js

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

if (cfg.something) { // switch on environment 
    // your logic 
} 
+0

मुझे app.js कोड नहीं समझा। मैं config.js में चर सेट करता हूं लेकिन फिर, मैं अपने app.js में उन्हें "पढ़" कैसे सकता हूं? – donald

+1

./config.js में अंतिम पंक्ति आपको उस कोड को आपके ./app.js फ़ाइल में निर्यात करने की अनुमति देती है। ./config.js आपके पर्यावरण के आधार पर उचित जेसन ऑब्जेक्ट देता है, और उसके बाद आप उस जेसन ऑब्जेक्ट पर वेरिएबल सीएफजी सेट करते हैं। हालांकि, एक गलती। config.something सीएफजी होना चाहिए।कुछ क्योंकि यह उस चर का नाम है जिसे आप बना रहे हैं। –

+0

सुनिश्चित करें कि आपने अपने उत्पादन सर्वर पर 'NODE_ENV' कॉन्फ़िगरेशन चर सेट किया है। Heroku के साथ यह 'heroku कॉन्फ़िगरेशन होगा: NODE_ENV = उत्पादन' सेट करें। ऐसा करने के बिना, 'config.js' की अंतिम पंक्ति काम नहीं करेगी। –

2

मैं https://github.com/qiangyu/nodejsconfig में एक कार्यान्वयन अपलोड कर दिया है। मुझे विश्वास है कि यह आपकी जरूरतों को पूरा करेगा। मूल रूप से, आप केवल एक विन्यास फाइल उपलब्ध कराने की आवश्यकता: फिर

dev.appAddress = '127.0.0.1:3000'; 
prod.appAddress = 'someDomain.com'; 

, आप prod वातावरण में appAddress पढ़ने के लिए कोड निम्न का उपयोग करें:

var xnconfig = require('nodejsconfig'); 
var fs = require('fs'); 

var data = fs.readFileSync(__dirname+"/config.properties", "UTF8"); 

// assume we will be using environment "prod" 
var config = xnconfig.parse("prod", data); 

// the output will be someDomain.com 
console.log(config.getConfig("appAddress")); 
6

यह npm-config उपयोग करने के लिए एक अच्छी जगह हो सकती है।

जब स्क्रिप्ट चला (देखें NPM-स्क्रिप्ट (7)) package.json "config" कुंजी वातावरण में ओवरराइट कर रहे हैं वहाँ <name>[@<version>]:<key>

की एक config परम मैं उन्हें इस्तेमाल नहीं होता है प्रत्येक प्रकार की परिवर्तनीय विन्यास सेटिंग के लिए, लेकिन मुझे लगता है कि यह यूआरएल और बंदरगाहों जैसे साधारण मामलों के लिए एक अच्छा समाधान है क्योंकि:

  1. आप उन्हें सीधे पैकेज.जेसन में डाल देते हैं।
  2. इसके अतिरिक्त, आप उन्हें कमांड लाइन या ENV चर के रूप में निर्दिष्ट कर सकते हैं।
  3. एनपीएम के माध्यम से चलने वाली कुछ भी उन्हें संदर्भित कर सकती है (उदा।, स्क्रिप्ट)।
  4. आप उन्हें सेट कर सकते हैं प्रति-उपयोगकर्ता `NPM config सेट foo के साथ: पोर्ट 80

एक चेतावनी है कि आपके package.json में config पैरामीटर केवल स्वचालित रूप से वातावरण में जब आप अपने कोड चलाने निर्यात किया जाता है है एनपीएम के माध्यम से। इसलिए, यदि आप इसे नोड के साथ चलाते हैं, जैसे node ./myapp.js, तो आप उम्मीद नहीं कर सकते कि process.env.npm_package_config_foo में आपका मान होगा। हालांकि, आप हमेशा var pkg = require('./package.json'); कर सकते हैं और pkg.config पर मानों तक पहुंच सकते हैं।

क्योंकि यह तुरंत स्पष्ट नहीं हो सकता है, मैं यह भी जोड़ूंगा कि npm_package_config पर्यावरण चर आपके एनपीएम पैकेज पर निर्भर ऐप्स तक बुलबुला नहीं करते हैं। इसलिए, यदि आपका निर्भर पैकेज पैकेज process.env.npm_package_config_foo को संदर्भित करता है, तो आश्रित पैकेज को अपने पैकेज.जेसन में परिभाषित करना होगा। मुझे लगता है कि यह एक "npm_package_config" है क्योंकि यह पेड़ को सभी तरह से धक्का देने के लिए समझ में नहीं आता है।

तो, मैं एक एनपीएम कॉन्फ़िगर चर का उपयोग कैसे करूं और इसे आधार पैकेज और पैकेज पर दोनों पैकेजों में पेड़ के ऊपर कैसे काम करता हूं? यह वास्तव में थोड़ा उलझन में है, और मुझे इसे परीक्षण और त्रुटि के माध्यम से समझना पड़ा।

मान लें कि आपके पास पैकेज कनेक्टर और पैकेज क्लाइंट है। ग्राहककनेक्टर पर निर्भर करता है और आप कनेक्टर कि या इस्तेमाल किया जा सकता ग्राहक में ओवरराइट के लिए एक config पैरामीटर निर्दिष्ट करना चाहते हैं। यदि आप अपने कनेक्टर मॉड्यूल में process.env.npm_package_config.port का उपयोग करते हैं, तो जब यह क्लाइंट मॉड्यूल पर निर्भर करता है, तो उस चर को निर्यात नहीं किया जाएगा और यह अपरिभाषित के रूप में समाप्त हो जाएगा।

हालांकि, अगर आप के बजाय process.env.npm_config_connector_port का उपयोग करें (नोटिस पहले एक npm_package_config और npm_config_packagename के साथ अन्य के साथ शुरू होता है), तो आप कम से कम सेट कर सकते हैं कि आपके .npmrc में npm config set connector:port 80 का उपयोग कर और यह "namespaced" हो जाएगा process.env.npm__config_connector_port हर जगह आप एनपीएम चलाते हैं, जिसमें क्लाइंट पर चलने वाली स्क्रिप्ट्स शामिल हैं जो कनेक्टर पर निर्भर करती हैं, और आप हमेशा अपने एनएनवी में, या अपने .npmrc में कमांड लाइन पर इसे ओवरराइट कर पाएंगे। आपको बस यह ध्यान रखना होगा कि, किसी भी पर्यावरण चर के साथ, यह हमेशा सेट नहीं किया जा सकता है। तो, मैं पहली बार (पसंदीदा) मूल्य के रूप में process.env.npm_config_connector_port के साथ डिफ़ॉल्ट ऑपरेटर का प्रयोग करेंगे:

var port = process.env.npm_config_connector_port || sane_default

यहाँ, sane_default अन्य सिफारिश से किसी एक पद्धति से भरा जा सकता है। व्यक्तिगत रूप से, मुझे जेएसओएन फाइलों में कम से कम कॉन्फ़िगरेशन डेटा रखना पसंद है, और package.json उन्हें अंदर रखने के लिए सबसे अच्छी JSON फ़ाइल की तरह लगता है। उन्हें कोड के बजाय डेटा में स्टोर करें और फिर आप आसानी से स्थिर JSON का उपयोग कर सकते हैं इन-लाइन, उन्हें गतिशील रूप से उत्पन्न करें, या उन्हें फाइल सिस्टम, यूआरएल या डेटाबेस से खींचें।