在连接回调之外访问MongoDB



我知道有人问过类似的问题,但实际上没有人显示这样做的代码,他们只链接到同样不显示代码的页面。

总之,基本上,我的节点服务器接收socket.io事件上的数据。我希望这些数据进入MongoDB。问题是,我看到的所有mongo的代码示例都只使用db对象在MongoClient.connect回调中操作数据库。

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

我需要的是有效的:

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

然后:

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

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

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

您应该能够将连接加载到var中,并只使用它,而不是为每个查询重新建立连接。

我自己也使用类似的方法,将连接代码定位到自己的模块中,类似于

注意:此代码是即兴编写的,未经测试,我有点醉了。

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();
  };
});

最新更新