Node.js MongoDB аварийно завершает работу на Client.close () - PullRequest
1 голос
/ 29 мая 2020

Я использую последнюю версию Mongodb 3.5.7 с Node.js и Express,

То, что я делаю, я вызываю функцию asyn c, когда вызывается API, и код выглядит следующим образом :

async function insert(data) {


        try {
             const connection = await client.connect();
             db =client.db(dbName);
             const insertion  = await db.collection('inserts').insertOne(data);
             //console.log(await client.close());
             await console.log('finished waiting promises');
             await client.close();
        } catch (err) {
            console.log(err.stack);
            return Promise.reject('false');
        }
        return new Promise(resolve =>{

            resolve();
        })
}

`На самом деле первый вызов API работает так хорошо и успешно вставляет данные в базу данных, проблема начинается со второй попытки, которая приводит к этой ошибке

Я также пробовал обещания в отдельные функции с каждой командой (connect - insert -close) с обещанием обратного вызова и ожиданием выполнения каждой из них.

Также пробовал вызвать функцию подключения, которую я создал. Затем (setdbname) .then (insert) .then (closedb) ...


the options [servers] is not supported
the options [caseTranslate] is not supported
the options [dbName] is not supported
the options [credentials] is not supported

MongoError: topology was destroyed
    at executeWriteOperation (C:\Users\raymo\Documents\Ticket\node_modules\mongodb\lib\core\topologies\replset.js:1188:21)
    at ReplSet.insert (C:\Users\raymo\Documents\Ticket\node_modules\mongodb\lib\core\topologies\replset.js:1257:3)
    at ReplSet.insert (C:\Users\raymo\Documents\Ticket\node_modules\mongodb\lib\topologies\topology_base.js:322:25)
    at insertDocuments (C:\Users\raymo\Documents\Ticket\node_modules\mongodb\lib\operations\common_functions.js:259:19)
    at InsertOneOperation.execute (C:\Users\raymo\Documents\Ticket\node_modules\mongodb\lib\operations\insert_one.js:26:5)
    at C:\Users\raymo\Documents\Ticket\node_modules\mongodb\lib\operations\execute_operation.js:98:26
    at new Promise (<anonymous>)
    at executeOperation (C:\Users\raymo\Documents\Ticket\node_modules\mongodb\lib\operations\execute_operation.js:91:10)
    at Collection.insertOne (C:\Users\raymo\Documents\Ticket\node_modules\mongodb\lib\collection.js:516:10)
    at Object.insert (C:\Users\raymo\Documents\Ticket\routes\Handlers\DatabaseHandler.js:68:63)

, а также я попытался вернуться к mon go v. 3.4.0

Я пробовал обычные функции обратного вызова, и они работают. но мне нужно обновить и работать с обещаниями и await / async. Пожалуйста, предложите правки, если мой вопрос не ясен.

1 Ответ

0 голосов
/ 29 мая 2020

client.close() закрывает текущее соединение с базой данных, включая все дочерние экземпляры базы данных, как указано в документации . Это означает, что, как только вы его вызовете, текущий клиент mon go больше не сможет использоваться. Вам нужно будет создать совершенно новый MongoClient и вызвать на нем connect().

Но - вы не должны этого делать, нет необходимости вручную создавать / закрывать соединение для каждой операции с базой данных.

Просто сохраните экземпляр соединения после выполнения const connection = await client.connect(); и повторно используйте / поделитесь им для других операций. MongoClient уже обрабатывает пул соединений за вас.

...