版本 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不是我最强的语言。有任何想法吗?提前谢谢!