2012-04-02 9 views
10

मैं नोड.जेएस के साथ एक्सप्रेसजे का उपयोग कर रहा हूं और अपने सभी मार्गों को 'मार्ग' फ़ोल्डर में डाल दिया है।एक्सप्रेसजेएस और अलग-अलग रूट फ़ाइलों के बीच गुजरने वाले चर

सर्वर पर, मैं अपने DB कनेक्शन करते हैं, तो इस तरह, मेरे मार्गों को परिभाषित:

var routes = require('./routes'); 

var db; 
dbconnect = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {}); 
dbconnect.open(function (err, db) { 

    db.authenticate(config.mongo_user, config.mongo_pass, function (err, success) { 
    if (success) { 

     //routes/index.js 
     app.get('/', routes.index); 

     //routes/users.js 
     app.get('/users', routes.users); 

    } 
    }); 
}); 

मैं इन मार्गों जावास्क्रिप्ट फ़ाइलों में से प्रत्येक के अंदर 'डाटाबेस' वस्तु का उपयोग करना चाहते हैं। मैं इसे 'app.js' फ़ाइल से index.js या users.js तक कैसे पास करूं?

धन्यवाद!

routes.js:

उत्तर

4

एक सुझाव यह एक समारोह है जो एक db पैरामीटर स्वीकार करता है के माध्यम से अपने मार्गों को बेनकाब करने के लिए है

module.exports = function(db) { 
    return { 
     index: function(req, res, next) { 
      // Funky db get stuff 
     } 
    } 
} 

रैपिंग मूल्यों इस तरह एक बंद में और अधिक कार्यों के साथ एक वस्तु लौटने है एक उपयोगी पैटर्न, जिसे कभी-कभी "मॉड्यूल पैटर्न का खुलासा" कहा जाता है। यह निर्भरता को स्पष्ट रूप से दिखाता है, जो कि एक लचीला कार्यात्मक दृष्टिकोण का उपयोग करते हुए आसान परीक्षण (उदाहरण के लिए एक नकली डीबी ऑब्जेक्ट का उपयोग करके) की अनुमति देता है।

+4

अब जब भी आप नियंत्रकों में "मॉड्यूल" का पुन: उपयोग करना चाहते हैं तो दोष अब होता है, आपको इसे हस्ताक्षर में जोड़ना होगा, और आप उन परिस्थितियों के साथ समाप्त हो सकते हैं जहां कुछ नियंत्रकों को 2 की आवश्यकता होती है, कुछ की आवश्यकता होती है 3 और एक की आवश्यकता होती है, और अब आपके पास एक हस्ताक्षर है जिसे सबसे बड़ा आम संप्रदाय समायोजित करना है। एक बेहतर दृष्टिकोण मुझे लगता है कि आपके डीबी व्यवहार को अपने आप के ढीले युग्मित मॉड्यूल में समाहित करना होगा। –

+2

@ ब्रैडहारीस: यह निश्चित रूप से एक कमी है। एक ही हस्ताक्षर रखने का एक तरीका, यदि आपको लगता है कि यह महत्वपूर्ण है, तो इसके बजाय पैरामीटर वाले ऑब्जेक्ट को स्वीकार करना है: '{db: db, foo: foo, bar: bar}'। आपका समाधान निश्चित रूप से इसे हल करने का एक बुरा तरीका नहीं है, हालांकि यह स्वयं की कमियों के साथ आता है - एक के लिए यूनिट परीक्षण करना मुश्किल है। –

13

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

//contents of your database.js file 
var database; 

module.exports = { 

    init : function(config, cb) { 
     database = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {}); 
     database.open(function (err, db) { 
      db.authenticate(config.mongo_user, config.mongo_pass, cb); 
     }); 
    }, 

    query : function(params, cb) { 
     database.query(params, cb); 
    } 

}; 

यह एक तुच्छ उदाहरण है, लेकिन उम्मीद है कि यह भर में बिंदु हो जाता है। नियंत्रकों या किसी भी फाइल जहां कि डेटाबेस वस्तु की जरूरत है, में आप बस ...

var db = require('database'); 

db.init(params, function(err, db) { 
    ... 
}); 


db.query(params, function(err, db) { 
    ... 
}); 

लाभ अब आप एक शिथिल युग्मित डेटाबेस उद्देश्य यह है कि बस के माध्यम से किसी भी अन्य नोड मॉड्यूल की तरह अपने आवेदन में कहीं भी इस्तेमाल किया जा सकता है आवश्यक बयान।

+2

मुझे यह पसंद है। एक अन्य उपयोगी पैटर्न एक ऑब्जेक्ट होना है जो किसी ऑब्जेक्ट के रूप में आपके एप्लिकेशन (या एप्लिकेशन संसाधन) का प्रतिनिधित्व करता हो। जैसे आवश्यकता है ('./ myapp.js')। डीबी या आवश्यकता है ('./ myapp.js')। config – Prestaul

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