Облачные функции: проверка наличия электронной почты в пользовательском документе в Firestore не работает - PullRequest
0 голосов
/ 16 января 2020

У меня есть облачная функция, которая добавляет права администратора для пользователя. Я заставил это работать, но когда я попытался добавить слой обработки ошибок (чтобы исключение не происходило, когда передается электронное письмо, не являющееся зарегистрированным пользователем), я не получил это к работе, и после царапин моя голова в течение нескольких часов, я все еще не могу понять это.

То, что происходит, - то, что этот код всегда возвращает null, и я думаю, возможно, это как-то связано с результатом checkIfUserWithEmailExists никогда не поворачивается true.

Это код, который я создал:

const functions = require("firebase-functions");
const admin = require("firebase-admin");

admin.initializeApp();

exports.addAdmin = functions.https.onCall(async (data, context) => {
  const result = await checkIfUserWithEmailExists(data.email);
  if (result === true) {
    if (context.auth.token.admin !== true) {
      return {
        error: "Request not authorized. User must be an admin to fulfill"
      };
    }
    const email_1 = data.email;
    return grantAdminRole(email_1).then(() => {
      return {
        result: `Request fulfilled! ${email_1} is now an admin`
      };
    });
  } else {
    return {
      error: "No user with this email was found"
    };
  }
});

async function grantAdminRole(email_2) {
  // get user and add custom claim (admin)
  const user = await admin.auth().getUserByEmail(email_2);
  if (user.customClaims && user.customClaims.admin === true) {
    return;
  }
  return admin.auth().setCustomUserClaims(user.uid, {
    admin: true
  });
}

//Checks that the email passed in is an existing user
async function checkIfUserWithEmailExists(email) {
  const userCollectionRef = admin.firestore().collection("users");
  userCollectionRef
    .where("email", "==", email)
    .get()
    .then(querySnapshot => {
      if (querySnapshot.size === 1) {
        return true;
      } else {
        return false;
      }
    });
}

1 Ответ

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

Вы не ожидаете обещания в своей функции проверки. Попробуйте это:

//Checks that the email passed in is an existing user
async function checkIfUserWithEmailExists(email) {
  const userCollectionRef = admin.firestore().collection("users");
  const querySnapshot = await userCollectionRef
    .where("email", "==", email)
    .get();

  return querySnapshot.size >= 1;
}

В общем случае комбинирование async / await и Promise .then() может быть затруднительным, поэтому я стараюсь избегать этого.

...