加载页面时,我希望显示一些产品,因此我发出GET请求,并从数据库中检索它们。但是,当我刷新页面时,我注意到旧的连接仍然存在。如何确保旧连接关闭?
这是我的代码:
const MongoClient = require('mongodb').MongoClient;
const connection = (closure) => {
return MongoClient.connect(config.connectionString, (err, client) => {
if (err) {
return winston.log('error', now() + err);
}
closure(client);
});
};
...
router.get('/products', (req, res) => {
connection((client) => {
client.db('dbname').collection('collectionname')
.find({})
.toArray()
.then((products) => {
response.data = products;
response.message = "Products retrieved successfully!"
res.json(response);
})
.catch((err) => {
winston.log('error', now() + err);
sendError(err, res);
});
});
});
答案 0 :(得分:1)
好吧,每次调用您的/products
路由时,您确实要创建一个新的MongoClient实例。在这种情况下,为了限制与数据库的连接数,您可以连接一次,然后保存MongoClient实例:
let client = undefined;
const connection = (closure) => {
// Return the client if any...
if(client) return closure(client);
return MongoClient.connect(config.connectionString, (err, c) => {
if (err) {
return winston.log('error', now() + err);
}
// Save the client.
client = c;
closure(client);
});
};
...或者您完成后实例化的close MongoClient连接:
router.get('/products', (req, res) => {
connection((client) => {
client.db('dbname').collection('collectionname')
.find({})
.toArray()
.then((products) => {
response.data = products;
response.message = "Products retrieved successfully!"
// Close the MongoClient...
client.close();
res.json(response);
})
.catch((err) => {
winston.log('error', now() + err);
sendError(err, res);
// Close the MongoClient...
client.close();
});
});
});
我建议您采用第一种解决方案:MongoClient维护一个连接池,因此拥有多个客户端没有任何优势。此外,它还允许您在执行其他任何操作之前检查数据库是否可远程使用(只需在应用程序init()上连接到数据库,然后保存客户端实例,就可以完成)。