MongoDB запрашивает асинхронно результаты цикла, возвращающиеся пустыми

#javascript #mongodb #express #npm

Вопрос:

У меня есть список идентификаторов для запроса Mongo, с которым я выполняю цикл for, и он всегда возвращает пустое []. Первоначально он продолжал возвращать обещания, поэтому я перешел forEach к стандарту для цикла, как вы видите здесь, и toArray() оба из которых привели к пустому [].

 async function queryRoles(id) {
    const db = await connectToMongo()
    let response;
    try {
        response = await db.collection("permissions").find({"_id": xxx}).toArray();
        console.log(await response);
    } catch (error) {
        console.log(error);
    }
    return response;
}

async function checkAuthorisation(list, groups) {
    for (const item of list) {
        const index = list.indexOf(item);
        const rolesList = await queryRoles(item._id);
        console.log(rolesList);
    };
    }
 

Список ролей всегда возвращается в [] и никогда ничем не заполняется.

Однако, если я просто обновлю код с помощью того же запроса для одного документа mongo без использования цикла for, ожидаемый ответ вернется, поэтому я знаю, что подключение к MongoDB в порядке.

Что я делаю не так? Вырываю себе волосы в этот момент!!

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

1. Можете ли вы завернуть заявление await следующим образом: response = (await db.collection("permissions").find({"_id": xxx})).toArray();

2. Да, это не имело никакого значения.

3. пожалуйста, сначала преобразуйте идентификатор строки в ObjectId.

4. вы можете преобразовать строку в идентификатор объекта, используя var mongoose = require(‘мангуст’); var id = мангуст. Типы. Объект(строка);

Ответ №1:

Вы пробовали этот подход,

   async function checkAuthorisation(list, groups) {
    const roleList = await Promise.all(
      list.map(async (item, index) => 
        await queryRoles(item._id)
      )
    );
    ...
  }