2014-01-10 42 views
2

我想在我的路由中重用MongoClient連接(我已經看到有很多方法使用舊的連接,但是我想使用MongoClient,我也會想有一個單獨的DB的配置文件在具有路由的快速應用中重複使用MongoClient

app.js(片斷)

var route = require('route'); 
app.get("/", route.test); 

dbconf.js

var MongoClient = require('mongodb').MongoClient; 
var mongourl = 'mongodb://localhost/test'; 
MongoClient.connect(mongourl, function(err, db) { 
    if(err) console.log('Error connecting to ' + mongourl + ': ' + err); 
    var coll = db.collection('testcollection'); 
}); 

route.js(SNI ppet)

exports.test = function(req, res) { 
    //i would like to use the connection created in dbconf.js here 
} 
+0

我寫了一個NPM模塊,能夠做到這一點:https://開頭npmjs .org/package/mongoconnect(它只要你只需要連接到一個數據庫) –

+0

[node-mongodb-native:我怎樣才能通過我的應用程序共享連接回調的db api對象](http ://stackoverflow.com/questions/13863675/node-mongodb-native-how-can-i-share-the-db-api-對象連接callbac) –

回答

1

您可以使用承諾。這樣連接只會打開一次,但您可以輕鬆地重用數據庫對象。一個非常基本的版本看起來服用點是這樣的:

database.js

var mongodb = require('mongodb'), 
    Q = require('q'); 

var MongoClient = mongodb.MongoClient; 
var deferred = Q.defer(); 

MongoClient.connect('mongodb://localhost/test', function(err, database) { 
    if (err) { 
    deferred.reject(err); 
    return; 
    } 
    deferred.resolve(database); 
}); 

exports.connect = function() { 
    return deferred.promise; 
}; 

router.js

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

exports.test = function(req, res) { 
    database.connect().then(function(db) { 
    var coll = db.collection('testcollection'); 
    }); 
}; 
+0

這不是一個好的做法,因爲它會在每個請求中初始化到Mongodb數據庫的連接 – Reda

0

你可以像這樣做,儘管它不使用單獨的dbconf .js文件(我沒有看到要說實話,因爲這樣應用程序索引將盡可能小,因爲路由是分開的。):

./index.js:

var MongoClient = require('mongodb').MongoClient, 
    routes = require('./routes'), 
    express = require('express') 
    app = new express(); 
MongoClient.connect('mongodb://localhost/test',function(err,db) { 
    if (err) { 
     // handle error 
    } 

    routes(app,db); 
}); 

app.listen(8080); 

./routes/index.js:

testHandler = require('./test'); 

var routes = function(app,db) { 
    var testhandler = new testHandler(db); 

    app.get('/',testhandler.index); 
} 

exports = module.exports = routes; 

./routes/test.js:

var testHandler = function(db) { 
    this.index = function(req,res) { 
     db.collection('data').find().toArray(function(err,data) { 
      res.end(JSON.stringify(data)); 
     }); 
    } 
} 
exports = module.exports = testHandler; 
+0

在Express 4.0中,已經引入了路由器中間件,它可以作爲_app.use '/',路線)_。 在這種情況下,如何將db對象傳遞給路由器中間件?任何想法? – NewtonCode