我什么时候应该关闭该数据库连接?

时间:2019-01-24 13:51:42

标签: node.js mongodb

我正在编写一个脚本来修改数据库中的所有条目。这是开始全部记录的开始。

 MongoClient = require('mongodb').MongoClient.connect("mongodb://localhost:27017/mydb", { useNewUrlParser: true } ),

(async () =>{
    let client;
    try {
        client = await MongoClient;
        let collection = client.db("booliscraper").collection("sold");
        let docs = await collection.find();
        docs.forEach((doc) => { 
            console.log(doc);
        })

  } catch(err) {
    log(err)
  }
})();

这很好,但是我想以某种方式关闭数据库连接。我尝试关闭它的次数超过了try / catch,但似乎在所有项目都通过之前关闭了连接。不明白为什么。

...
  } catch(err) {
    log(err)
  }
  client.close();
})();

2 个答案:

答案 0 :(得分:2)

docs<Collection>.find()的结果,是一个游标; <Cursor>.forEach()是一个异步函数。

在遍历光标之前,有效地调用client.close()的意思。

您可以将第二个回调传递给forEach,一旦用完光标,该回调将被执行:

MongoClient = require('mongodb').MongoClient.connect("mongodb://localhost:27017/mydb", { useNewUrlParser: true } ),

(async () =>{
    let client;
    try {
        client = await MongoClient;
        let collection = client.db("booliscraper").collection("sold");
        let docs = await collection.find();
        docs.forEach((doc) => { 
            console.log(doc);
        }, () => {
            //cursor is exhausted, close connection
            client.close();
        })

  } catch(err) {
    log(err)
  }
})();

有关更多信息,请参见Node.js Mongo DB Driver API

答案 1 :(得分:0)

您可以添加finally块并在那里关闭MongoDB连接

(async () => {
let client;
try {
    client = await MongoClient;
    let collection = client.db("booliscraper").collection("sold");
    let docs = await collection.find();
    await docs.forEach((doc) => {
        console.log(doc);
    })

} catch (err) {
    log(err)
} finally {
    client.close()
}})();

这里是参考文献 try...catch