我有一个节点应用程序,每隔10秒调用一次mongoDB,但是查看终端中的输出,连接只会继续计数并且似乎永远不会关闭:
我的代码每10秒点击一次ddb:
const MongoClient = require("mongodb").MongoClient
setInterval(function(){
MongoClient.connect(uri, (err, client) => {
if (err){
console.log(err);
}
database = client.db(databaseName)
getData(function(data){
if(data.length > 0){
db_response = data;
params["fieldA"] = db_response[0]['fieldA'];
}
})
})
}, 10000)
function getData(callback){
var query = { fieldA: "foo" };
database.collection(CollectionName).find(query).toArray(function(err, result){
if (err){
throw err;
}
callback(result);
})
}
(vars uri,CollectionName和databaseName是先前声明的)我想我需要做什么(并且还没想到)是在服务器启动时连接到DB一次,然后在成功连接时运行getData()函数,这是否意味着数据库变量需要是全局变量?
正确识别后,您只需要创建一次数据库连接。因此,不是使用setInterval
包装db连接创建,而是将setInterval
包装在您想要重复的唯一函数周围,在本例中为getData
。
在你的另一个问题上,数据库变量不需要全局,但你是对的getData
确实需要使用它。因此,将它作为参数与您的回调函数一起传递。
如果你想关闭你的连接,请使用client.close();
内的MongoClient.connect
const MongoClient = require("mongodb").MongoClient
MongoClient.connect(uri, (err, client) => {
if (err){
console.log(err);
}
const database = client.db(databaseName);
setInterval(function(){
getData(database, function(data){
if(data.length > 0){
db_response = data;
params["fieldA"] = db_response[0]['fieldA'];
}
})
}, 10000)
})
function getData(db, callback){
var query = { fieldA: "foo" };
db.collection(CollectionName).find(query).toArray(function(err, result){
if (err){
throw err;
}
callback(result);
})
}