Nodejs драйвер mongodb зависает на клиенте close - PullRequest
0 голосов
/ 08 января 2020

У меня есть следующий код, и я не могу понять, почему мой процесс зависает на линии, которая пытается закрыть соединение с mongodb, вот мой код:

async function save(clientCredentials, newFieldsToUpdate){

    const url = `mongodb://${clientCredentials.username}:${clientCredentials.password}@my.server.ip:22222/${clientCredentials.database}`

    const client = await MongoClient.connect(url, {useNewUrlParser:true, useUnifiedTopology: true})
        .catch(err => { console.log(err); });

    const db = client.db(clientName);

    const collection = await db.collection("products");

    let execute = false;

    const updateOps = [];

    for(let objectIdentifier in newFieldsToUpdate){

        let updateOperation = {};
        updateOperation['$set'] = newFieldsToUpdate[objectIdentifier];

        let id = mongodb.ObjectID(objectIdentifier);
        execute = true;
        updateOps.push({ updateOne: { filter: {_id: id}, update: {$set: newFieldsToUpdate[objectIdentifier]}, upsert:true } })

    }

    if(execute){

        try {
           console.log('executing');  // I see this line
           let report = await collection.bulkWrite(updateOps);
           console.log('executed');   // I see this line
           await client.close();
           console.log('closed conn');  // I don't see this line! why? it's weird
           return report;
        } catch(ex){
            console.error(ex);
        }       
    } else {
        console.log('not executing');
    }
}

Заранее спасибо за любые help!

РЕДАКТИРОВАТЬ: Массовая операция составляет около 200 документов, если я попробую с одним документом, это работает, это странно. Драйвер Mongodb для узла версии 3.3.2

EDIT2: я заметил, что при использовании параметра poolSize: 1 на мон go он успешно закрывает соединение, но при использовании значения по умолчанию poolSize 5 он не закрывается, какие-либо предложения, почему это может происходить?

1 Ответ

1 голос
/ 08 января 2020

Убедитесь, что вы используете последнюю версию драйвера mongodb (для уверенности удалите node_modules), так как в более старой версии есть ошибка, из-за которой метод bulkWrite молча завершается ошибкой из-за некоторой ошибки, упомянутой здесь - { ссылка }

Прежде чем пытаться закрыть соединение, вы также должны проверить, подключено оно или нет. поэтому код будет

if (client.isConnected) {
  await client.close();
}

Надеюсь, это поможет

...