在连接回调之外访问MongoDB

时间:2016-04-09 05:37:37

标签: node.js mongodb

我知道已经提出了类似的问题,但实际上没有人显示执行此操作的代码,它们只链接到也不显示代码的页面。

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

因为,我将获得大量这些数据,我不想一遍又一遍地初始化。

我需要的是这个:

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

然后是:

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

2 个答案:

答案 0 :(得分:6)

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

var connect = MongoClient.connect(url);

socket.on('data', function(data) {
  connect.then(function(db) {

  });
});

socket.on('otherData', function(data) {
  connect.then(function(db) {

  });
});

答案 1 :(得分:1)

您应该能够将连接加载到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();
  };
});