Mongo刷新每个页面上的新连接

时间:2018-06-25 10:48:53

标签: node.js mongodb

加载页面时,我希望显示一些产品,因此我发出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);
            });
    });
});

1 个答案:

答案 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()上连接到数据库,然后保存客户端实例,就可以完成)。