2013-08-01 32 views
10

के बीच डीबी साझा करने के लिए वैश्विक चर का उपयोग करें मैं 'mongodb' मॉड्यूल का उपयोग कर एक नोडज/mongodb ऐप पर काम कर रहा हूँ। एप्लिकेशनमॉड्यूल

node main.js 

साथ शुरू की है main.js में, मैं db से कनेक्ट और 'डाटाबेस' वैश्विक चर में कनेक्शन रखने के लिए। 'डीबी' का उपयोग तब 'सर्वर' के आंतरिक तरीकों में किया जाता है। मैं वैश्विक चर के रूप में 'डीबी' होने से बचना चाहता हूं लेकिन ऐसा करने का सही तरीका नहीं मिला।

मेरे वर्तमान main.js:

var server  = require('./lib/server'); 
var MongoClient = require('mongodb').MongoClient; 
var Server  = require('mongodb').Server; 
var mongoClient = new MongoClient(new Server(HOST, PORT)); 
db = null; 

// Database connection 
mongoClient.open(function(err, mongoClient) { 
    if(!err){ 
    // Database selection 
    db = mongoClient.db(DB); 

    // Launch web server 
    server.start(); // usage of 'db' in this part 

    } else { 
    console.log(err.message); 
    process.exit(1); 
    } 
}); 

एक क्लीनर रास्ते से किसी भी विचार?

अद्यतन

मैं अंत में connection.js में एक मॉड्यूल बनाया:

var config  = require('../config/config'); 
var url   = 'mongodb://' + config.db.host + ':' + config.db.port + '/' + config.db.name; 
var MongoClient = require('mongodb').MongoClient; 
var db   = null; 

module.exports = function(cb){ 
    if(db){ 
    cb(db); 
    return; 
    } 

    MongoClient.connect(url, function(err, conn) { 
    if(err){ 
     console.log(err.message); 
     throw new Error(err); 
    } else { 
     db = conn; 
     cb(db); 
    } 
    }); 
} 

हर बार जब मैं कनेक्शन मैं फोन प्राप्त करने की आवश्यकता:

var connection = require('./connection'); 
connection(function(db){ 
    // doing some stuff with the db 
}); 

यह बहुत काम कर रहा है कुंआ।

इस दृष्टिकोण के साथ कोई संभावित विफलता?

+1

इसे किसी भी मॉड्यूल को किसी कन्स्ट्रक्टर (कन्स्ट्रक्टर निर्भरता इंजेक्शन) में उपयोग करने के लिए पास करें या उस मॉड्यूल में रखें जिसमें उस आवृत्ति है और अन्य मॉड्यूल की आवश्यकता है और डीबी इंस्टेंस और अन्य सेवाओं की आवश्यकता है (सेवा स्थान) (आमतौर पर) बदतर) –

+0

यदि आप वास्तव में ग्लोबल्स के साथ रहने की योजना बना रहे हैं, तो मैं इसके बजाय 'global.db' का उपयोग करने का संकेत दूंगा। कम से कम, अवैध जेएस नहीं है। – gustavohenke

+0

मैं इस वैश्विक से छुटकारा पाना चाहता हूं :) – Luc

उत्तर

3

आप एक प्रदाता की तरह कुछ रैपर बना सकते हैं और इसे प्रदाता.जेएस में डाल सकते हैं, उदाहरण के लिए।

var db = new Provider(db_name, host, port, username, password); 
db.getCollection('collection name', callback); 
+1

क्या आप सुनिश्चित कर सकते हैं कि कनेक्शन db.getCollection को कॉल करने से पहले कनेक्शन किया जाता है (कॉलबैक विधि कहा जाता है)? – Luc

6

मैं आम तौर पर एक परियोजना उपयोगिताओं फ़ाइल है कि इन चीजों के एक नंबर शामिल शामिल हैं, बस इसे आसान बनाने के लिए:

Provider = function (db_name, host, port, username, password) { 
    var that = this; 
    var conn = generate_url(db_name, host, port, username, password); // you need to implement your version of generate_url() 

    MongoClient.connect(conn, function (err, db) { 
     if (err) { 
      throw err; 
     } 
     that.db = db; 
    }); 
}; 

//add the data access functions 
Provider.prototype.getCollection = function (collectionName, callback) { 
    this.db.collection(collectionName, collectionOptions, callback); 
}; 

exports.Provider = Provider; 

इस तरह आप सेवा का इस्तेमाल कर रहा है। यह एक छद्म वैश्विक के रूप में कार्य करता है, लेकिन कई सामान्य समस्याओं के बिना ग्लोबल्स लागू होते हैं।

उदाहरण के लिए,

projectUtils.js

module.exports = { 

    initialize: function(next){ 
    // initialization actions, there can be many of these 
    this.initializeDB(next); 
    }, 

    initializeDb: function(next){ 
    mongoClient.open(function(err, mongoClient) { 
     if(err) return next(err); 
     module.exports.db = mongoClient.db(DB); 
     next(); 
    }); 
    } 
} 

var projectUtils = require('projectUtils'); 

// (snip) 
projectUtils.initialize(function(err) { 
    if(err) throw err; // bad DB initialization 
    // After this point and inside any of your routes, 
    // projectUtils.db is available for use. 
    app.listen(port); 
} 

app.js एक अतुल्यकालिक इनिशियलाइज़() फ़ंक्शन का उपयोग करके आप वह सब यकीन है कि हो सकता है डेटाबेस कनेक्शन, फ़ाइल I/O, आदि, सर्वर शुरू करने से पहले किया जाता है।

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