在连接callback之外访问MongoDB

我知道类似的问题已经被问到,但没有人真正显示这样做的代码,他们只链接到也不显示代码的页面。

无论如何,基本上我的节点服务器在socket.io事件上接收数据。 我想要这些数据进入MongoDB。 问题是我所看到的所有代码示例只能使用db对象在MongoClient.connectcallback中操作db

因为,我会得到很多这样的数据,我不想一遍又一遍的初始化。

我需要的是这样的:

 MongoClient.connect(("mongodb://" + process.env.IP + ":27017/feedback"), function(err, db) { ... }); 

再后来:

 socket.on('data', function (data) { db.doStuff(); }); 

MongoClient.connect()返回一个承诺,如果你不给它一个callback,你可以声明一个全局承诺:

 var connect = MongoClient.connect(url); socket.on('data', function(data) { connect.then(function(db) { }); }); socket.on('otherData', function(data) { connect.then(function(db) { }); }); 

您应该能够将连接加载到一个变种,并使用,而不是重新build立每个查询连接。

我自己使用类似的方法,将连接代码定位到它自己的模块中,如下所示:

注意:这段代码是非正式的,未经testing,我有点醉了。

connect.js

 var MongoClient = require('mongodb').MongoClient; module.exports = function(params) { var ip = params.ip || process.env.IP; var port = params.port || 27017; var collection = params.collection; var db = MongoClient.connect('mongodb://' + ip + ':' + port + '/' + collection); return db; } 

然后,在应用程序中的任何其他模块中,您将需要connection.js并传递任何给定连接的params ,如下所示:

onFeedback.js

 var feedbackDB = require('./connection.js')({ collection : 'feedback' }); socket.on('data', function (data) { feedbackDB(function(db){ db.doStuff(); }; });