Mongo устанавливает новое соединение на каждой странице обновления - PullRequest
0 голосов
/ 25 июня 2018

Когда я загружаю свою страницу, я хочу, чтобы некоторые продукты отображались, поэтому я делаю 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 голосов
/ 25 июня 2018

Ну, каждый раз, когда вызывается ваш маршрут /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);
    });
};

... или просто закрыть подключение 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 () и сохраните экземпляр клиента, и все будет готово).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...