MongoDB,Node.JS - “错误:EMFILE:打开文件太多”

时间:2017-05-24 14:40:00

标签: javascript node.js mongodb express asynchronous

版本 MongoDB:3.4.3 快递:4.1.4 节点:7.8.0

背景:处理一个项目,该项目利用Node.JS + Express服务器访问MongoDB服务器(在同一个盒子上)以进行更新和读取。这些更新来自一组Raspberry Pi发布的某些环境细节(3 Pi的发布速度为每5秒1次);读取来自各种来源。在我当前的设置中,我收到标题中注明的错误:“错误:EMFILE:太多打开文件”,因为与MongoDB服务器的连接太多。打开文件的'ulimit'设置为1024,正如您所期望的那样,每Pi的后期速率为3 Pi,生成足够的连接以产生没有读取的错误大约需要20分钟。许多“解决”此问题的建议是增加打开文件限制,但是,如果Express服务器无限期运行,它只会推迟发生错误的时间,而不是实际修复问题。

声明外部查询函数:

mongo = require('mongodb').MongoClient;

更新功能:

function update(input){
  var pairlist = [];
  var rpiMac = "";
  for(var line in input){
    if(line === "rpiMac")
      rpiMac = input[line];
    else
      pairlist.push(input[line]);
  }

  var d = new Date();
  var current_time = Math.round(d.getTime() / 1000);

  var MONGO_DB = process.env.MONGO_DB;

  var MongoConnect = mongo.connect(MONGO_DB, function(err, db) {
    if(err)
      return {code:500,msg:"Can't connect to MongoDB."};

    var table = db.collection('proximity_details');

    for(var i = 0; i < pairlist.length; i++){
      var cond = {rpiMac:rpiMac, clientMac:pairlist[i][0]};
      var set = {rpiMac:rpiMac,clientMac:pairlist[i][0],rssi:parseFloat(pairlist[i][1]),seenEpoch:current_time};
      var optns = {upsert:true};

      if(['C8:C0:77:D5:0C:72','C7:1F:6A:B0:E5:CC','C1:64:41:BF:40:F3','DF:BE:DA:B2:47:CB'].indexOf(pairlist[i][0]) >= 0){
        table.findOneAndUpdate(cond,set,optns);
      }
    }
    db.close();
  });

  return {code:200,msg:"DB successfully updated."};
};

/****EXPORT FUNCTION(S)****/
exports.update = update;

阅读功能:

function proximity(res){
  var d = new Date();
  var currentEpoch = Math.round(d.getTime() / 1000);
  var pastFiveMin = currentEpoch - 300;

  var MONGO_DB = process.env.MONGO_DB;
  var MongoConnect = mongo.connect(MONGO_DB,function(err,db){
    var query = {seenEpoch : { $gt : pastFiveMin }};
    db.collection('proximity_details').find(query).toArray(function(err,docs){
      res.status(200);
      res.send(docs);
      //console.log(docs);
    });
    db.close();
  });
};

/****EXPORT FUNCTION(S)****/
exports.proximity = proximity;

所以,我的理解是连接应该在异步“MongoClient.connect()”函数调用结束时关闭,但似乎没有发生。没有同步版本的函数集来查询MongoDB然后强制连接关闭,也没有我知道关闭异步调用的方法。我相信MongoDB的旧版Node.JS驱动程序允许显式连接关闭,但到目前为止还没有找到可行的解决方案。

如果我忽略了一些愚蠢的事情,那就不会感到惊讶;无论如何,JS不是我最强的语言。有任何想法吗?提前谢谢!

0 个答案:

没有答案