2012-10-26 30 views
6

मैं कुछ अनुभवी नोड.जेएस प्रोग्रामर से यहां कुछ दिशा ढूंढ रहा हूं। मैं जो सबसे बड़ा मुद्दा चला रहा हूं वह भिन्न मॉड्यूल में चर के चारों ओर गुज़र रहा है।node.js गुजरने वाले चर

var db = mongoose.createConnection('localhost','test'); 

अब मैं अपने मार्गों server.js फ़ाइल वे वहाँ अपनी फ़ाइलों में विभाजित हैं के अंदर नहीं चला रहा हूँ: मेरे server.js में उदाहरण के लिए मैं निम्नलिखित है। एक ब्लॉग उदाहरण के लिए तो यह इस तरह हो सकता है:

app.get('/blog/post/:id',function(req,res){ 
    //do something here 
} 

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

किसी भी मदद की सराहना की जाती है।

उत्तर

3

यहां मैं अपने असली विश्व ऐप में क्या करता हूं।

मेरे पास redis नामक एक मॉड्यूल है (यह वह डेटाबेस है जिसका मैं उपयोग कर रहा हूं)। इसमें निम्नलिखित कोड शामिल हैं:

var store; 

exports.store = store = redis.createClient(config.port, config.url); 

तो, यदि मुझे आवश्यकता हो तो मैं सीधे ग्राहक तक पहुंच सकता हूं। मैं लगभग कभी ऐसा नहीं करता हूं। एक ही मॉड्यूल इस तरह कोड शामिल हैं:

var db = require('redis'); 

db.getData('someData', function(err, result){ 
    console.log(result); // real world code goes here! 
}); 

नोड मॉड्यूल प्रणाली का ख्याल रखता है:

exports.getData = function(dataID, callback){ 

    var key = DATA_STORE_PREFIX; 

    try{ 
     store.hget(key, dataID, callback); 
    } catch(err){ 
     callback(err); 
    } 
} 

मैं और एक या अधिक मार्ग मॉड्यूल में redis मॉड्यूल सहित इस तरह यह फोन करके इस का उपयोग आराम।

+0

की आवश्यकता के बारे में वास्तविक मान्य बिंदु बनाया है, इसलिए इसके बारे में मेरा एकमात्र प्रश्न यह हर बार एक नया कनेक्शन बनाता है? मैंने वास्तव में यह पहले से ही करना शुरू कर दिया है, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि यह नहीं है। – ngreenwood6

+0

ऐसा लगता है कि मौजूदा कनेक्शन का पुन: उपयोग करना प्रतीत होता है। यदि उपयोग नहीं किए जाने पर कनेक्शन स्वचालित रूप से गिरा दिए जाते हैं तो यह फिर से कनेक्ट हो जाएगा। –

2

ऐसा करने का एक तरीका है किसी ऑब्जेक्ट की संपत्ति के रूप में कनेक्शन जोड़ना जो सभी मॉड्यूल के लिए उपलब्ध होगा। मेरी एक्सप्रेस अनुप्रयोग में उदाहरण के लिए मैं अपने मुख्य अनुप्रयोग फ़ाइल में कुछ इस तरह है:

require('./config/database')(app); 

और config/database फ़ाइल की तरह दिखता है:

var mongoose = require('mongoose'); 

module.exports = function(app) { 
    var database = app.get('env'); 
    var uri = database === 'production' ? 'something...' : 'localhost'; 
    return app.locals.db = mongoose.createConnection(uri, database); 
}; 

किसी भी मॉड्यूल है कि एक डाटाबेस कनेक्शन की आवश्यकता तो बस app.locals.db उपयोग कर सकते हैं एक फ़ंक्शन को निर्यात करके app को तर्क के रूप में लेता है (बस ऊपर की तरह)। बेशक आपको इसे कुछ हद तक संशोधित करने की आवश्यकता होगी यदि आप एक्सप्रेस के अलावा कुछ और उपयोग कर रहे हैं, लेकिन विचार वही रहता है।

+0

बहुत रचनात्मक समाधान लेकिन मुझे लगता है कि स्थानीय बादलों के प्रकार।स्थानीय स्तर पर डेटा को स्वचालित रूप से – ngreenwood6

+0

में डेटा पास करने के लिए यह निश्चित रूप से उपयोगी है, मुझे लगता है कि 'app.locals' क्या है। मैंने इसे अपने वर्तमान प्रोजेक्ट में रिक्त रूप से स्वत: लोडिंग और एप्लिकेशन के सभी प्रमुख घटकों को 'app.locals' के गुणों को असाइन करके असाइन किया है - उदा। मेरे सभी मॉडल 'app.locals.models' में हैं। मुझे इस पैटर्न को दो कारणों से पसंद है: सबसे पहले, मेरे मॉड्यूल फ़ाइल संरचना से स्वतंत्र रूप से काम करते हैं, यानी मुझे जगह पर 'आवश्यकता (' ../../ मॉडल/उपयोगकर्ता ') जैसी चीजें लिखने की ज़रूरत नहीं है। दूसरा, मेरे साझा पुस्तकालय विचारों के लिए उपलब्ध हैं - उदा। अगर मेरे पास 'app.locals.lib.urlFor' है, तो मैं इसे 'lib.urlFor' के रूप में देख सकता हूं। –

+0

हाँ जैसे मैंने कहा कि मुझे लगता है कि इसका उपयोग है (विशेष रूप से कॉन्फ़िगरेशन या उपयोगिताओं के लिए) लेकिन डीबी मुझे बस आवश्यकता होने में सक्षम होना पसंद है। धन्यवाद हालांकि इनपुट के लिए आपने – ngreenwood6

1

आप एक्सप्रेस का उपयोग कर रहे हैं, मैं देखता हूं। बस कार्य करें:

app.set('db', mongoose.createConnection('localhost','test')) 

तो किसी भी मॉड्यूल निर्माता में, app चर पारित करने के लिए सुनिश्चित करें, और आप app.get('db') का उपयोग db काम करने के लिए प्राप्त करने के लिए कर सकते हैं।

+0

उत्तर के लिए धन्यवाद लेकिन मुझे लगता है कि दूसरा समाधान बहुत बेहतर है। फिर मेरे मॉड्यूल अधिक सामान्य हो सकते हैं और यह सिर्फ क्लीनर लगता है। – ngreenwood6

संबंधित मुद्दे