Итерация по массиву в попытке… поймать… наконец приводит к «MongoError: невозможно использовать сеанс, который закончился»

У меня есть функция, которая подключается к базе данных Mongo, а затем находит в базе данных документы, соответствующие массиву.

Функция на самом деле работает нормально, и нужные мне данные находятся и возвращаются функцией checkIfExist(). Однако функция возвращает ошибку в консоли, несмотря на то, что она работает. Ошибка «MongoError: невозможно использовать сеанс, который завершился», как показано ниже.

Я не понимаю, что я делаю неправильно здесь.

Ошибка:

Функция:

async function main() {
  const uri = 'URL';
  const client = new MongoClient(uri, { useUnifiedTopology: true });
  const pairData = [`_EURAUD_data`, `_EURCAD_data`, `_EURCHF_data`];
  await client.connect();
  const db = client.db('daily-ohlc').collection('ohlcs');

  try {
    const checkIfExist = async () => {
      pairData.map(pair => {
        const findstuff = db.find({ _id: pair._id }).toArray();
        console.info(`${findstuff}`);
      });
    };
    await checkIfExist();
  } catch (e) {
    console.error(e);
  } finally {
    console.info(`closing timne`);
    await client.close();
  }
}
main().catch(console.error);

Вещи, которые я пробовал.

  1. Я попытался добавить двухсекундный setTimeout в await.client.close(), и я не получаю ошибку. Так что похоже, что клиент закрывается слишком быстро.
  2. Замена .map в checkIfExist(), чтобы он не повторялся и работал без ошибок.

return pairData.map... вы не возвращаете значение из функции карты, и вам не нужно размещать ожидание сразу за блоком try. Затем, когда вы вызываете main(), используйте then для регистрации объекта разрешения, если обещание возвращается, а затем вы можете использовать catch для регистрации ошибки, если обещание отклонено.

rags2riches-prog 10.12.2020 22:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
263
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение было простым: обернуть Array.map в метод Promise.all. Когда я сделал это, Array.map завершился, прежде чем перейти к блоку finally.

async function main() {
  const uri = 'URL';
  const client = new MongoClient(uri, { useUnifiedTopology: true });

  try {
    await client.connect();
    const pairData = await cleanObject();
    const db = client.db('daily-ohlc').collection('ohlcs');
    const updateOrCreate = async () =>
      //needs to be in a promise
      Promise.all(
        pairData.map(async pair => {
          const check = db
            .find({ _id: pair._id, 'data.date': pair.data[0].date })
            .toArray()
            .then(value => value.length === 0);

          if (check) {
            return db
              .updateOne({ _id: pair._id, 'data.date': pair.data[0].date }, { $set: { 'data.$': pair.data[0] } }, { upsert: true })
              .then(result => `UPDATED DAY: ${pair._id}`)
              .catch(er => console.info(er));
          }
          return db
            .updateOne({ _id: pair._id }, { $push: { data: { $each: [pair.data[0]], $position: 0 } } }, { upsert: true })
            .then(result => `ADDED DAY: ${pair._id}`)
            .catch(er => console.info(er));
        })
      );
    console.info(await updateOrCreate());
    await updateOrCreate();
  } catch (e) {
    console.error(e);
  } finally {
    console.info(`sever connection closing...`);
    await client.close();
  }
}
main().catch(error => console.info(error));

Другие вопросы по теме