Получить информацию о нескольких пользователях из firebase auth, используя Node js - PullRequest
0 голосов
/ 19 апреля 2020

Я использую аутентификацию Firebase для хранения пользователей. У меня есть два типа пользователей: менеджер и сотрудник. Я храню UID менеджера в сотруднике Firestore вместе с UID сотрудника. Структура показана ниже.

Структура Firestore

Company
|
> Document's ID
              |
              > mng_uid: Manager's UID
              > emp_uid: Employee's UID

Теперь я хочу выполнить запрос типа «Получить информацию о сотрудниках, который под указанным c менеджером. " Для этого я попытался запустить приведенный ниже код.

module.exports = {
    get_users: async (mng_uid, emp_uid) => {
        return await db.collection("Company").where("manager_uid", "==", mng_uid).get().then(snaps => {
            if (!snaps.empty) {
                let resp = {};
                let i = 0;
                snaps.forEach(async (snap) => {
                    resp[i] = await admin.auth().getUser(emp_uid).then(userRecord => {
                        return userRecord;
                    }).catch(err => {
                        return err;
                    });
                    i++;
                });
                return resp;
            }
            else return "Oops! Not found.";
        }).catch(() => {
            return "Error in retrieving employees.";
        });
    }
}

Над кодом возвращается {}. Я попытался отладить, вернув данные из указанных c строк. Я узнал, что проблема заключается в получении информации о пользователе, используя функцию аутентификации firebase, которую я использовал в forEach l oop. Но это не возвращает никакой ошибки.

Спасибо.

1 Ответ

1 голос
/ 19 апреля 2020

В вашем коде необходимо исправить несколько пунктов:

  • Вы используете async/await с then(), что не рекомендуется. Используйте только один из этих подходов.
  • Если я правильно понимаю вашу цель («Получить информацию о сотрудниках, которая указана в качестве c manager»), вам не нужно передавать параметр emp_uid вашему функции, но для каждого snap вам нужно прочитать значение поля emp_uid с помощью snap.data().emp_uid
  • Наконец, вам нужно использовать Promise.all() для выполнения всех асинхронных getUser() параллельные вызовы методов.

Таким образом, следующее должно помочь:

  module.exports = {
    get_users: async (mng_uid) => {
      try {
        const snaps = await db
          .collection('Company')
          .where('manager_uid', '==', mng_uid)
          .get();

        if (!snaps.empty) {
          const promises = [];
          snaps.forEach(snap => {
            promises.push(admin.auth().getUser(snap.data().emp_uid));
          });

          return Promise.all(promises);  //This will return an Array of UserRecords

        } else return 'Oops! Not found.';
      } catch (error) {
        //...
      }
    },
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...