Получение «MongoExpiredSessionError: Не удается использовать завершенный сеанс» при использовании forEach для обновления документа, но почему?

#javascript #mongodb #loops

Вопрос:

Я просто пытаюсь вставить пару значений ключа, т. Е. {отметка : готово}, в свою базу данных Mongo, используя идентификатор, который я сохранил в массиве.

Но ни за что на свете я не могу понять, почему, если я использую цикл for, он работает нормально. Но если я использую цикл forEach, он выдает ошибку «Невозможно использовать завершенный сеанс».

Я надеюсь, что кто-нибудь ТАК поможет объяснить, почему это происходит

Код Котельной Плиты

 import { MongoClient } from "mongodb"; const uri = "mongodb://localhost:27018/"; const client = new MongoClient(uri);  

Функция с реализацией «для цикла»

 async function updateMongo1() {  const db = client.db("testDB");  const coll = db.collection("testCollection");  await client.connect();  try {  let array = [  "2021-10-18",  "2021-10-17",  "2021-10-16",  "2021-10-15",  "2021-10-14",  ];  for (let i = 0; i lt; array.length; i  ) {  await coll.updateOne(  { _id: array[i] },  { $set: { mark: "done" } },  { upsert: true }  );  }  } catch (e) {  console.error(e.message);  } finally {  await client.close();  } }  

Функция с реализацией «forEach»

 async function updateMongo2() {  const db = client.db("testDB");  const coll = db.collection("testCollection");  await client.connect();  try {  let array = [  "2021-10-18",  "2021-10-17",  "2021-10-16",  "2021-10-15",  "2021-10-14",  ];   array.forEach(async (element) =gt; {  await coll.updateOne(  { _id: element },  { $set: { mark: "done" } },  { upsert: true }  );  });  } catch (e) {  console.error(e.message);  } finally {  await client.close();  } }  

выполнение разных реализаций дает разные результаты.

 (async () =gt; {  //await updateMongo1(); //-gt; this works  await updateMongo2(); //-gt; this gives "MongoExpiredSessionError: Cannot use a session that has ended" what gives?? })();  

Пожалуйста, дайте мне знать, почему это происходит?

Ответ №1:

Переменная элемента представляет собой массив, например ["2021-10-18"] . Во второй реализации вы должны были получить доступ element[0] , но забыли это сделать, поэтому вы поместили массив в поле _id.

Я не знаю, является ли это причиной вашей ошибки, но это ошибка в реализации.

Комментарии:

1. Твое право!! Я обновил код, чтобы значения больше не были вложенными.

2. Можете ли вы отметить мой ответ как правильный, пожалуйста 🙂

3. Я думаю, что вы обнаружили ошибку реализации в моем коде, но я не искал ответа на этот вопрос. В любом случае, я не думаю, что получу ответ на этот вопрос.