Как выполнить проверку Firestore в функциях и отправить результат обратно клиенту? - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь проверить, существует ли имя пользователя в Firestore. Я делаю это в функциях, это выглядит так:

exports.checkUser = functions.https.onCall(async (data, context) => {
  // Uses the username from the data to compare it to the doc
  const usernameExists = await admin
    .firestore()
    .collection('users')
    .doc(data.username)
    .get();

  // Check the the username passed exists
  if (usernameExists.exists) {
    //If the username that is passed exists, we want to repond with an error
    throw new functions.https.HttpsError(
      'already-exists',
      'This username is already taken. Please try another one.'
    );
  }

На стороне клиента у меня есть что-то вроде этого:

async register({ username, email, password }) {
    const callUsernameFunction = this.functions.httpsCallable('checkUser');
    const usernamePrint = callUsernameFunction({ username });
    return usernamePrint;
  }

Мой Cloud Firestore выглядит так: this is what my cloud firestore looks like

Это прекрасно работает. Когда я набираю имя пользователя, которое уже используется, я получаю сообщение об ошибке, в котором говорится, что оно уже используется. Тем не менее, я не уверен, как реализовать this.auth.createUserWithEmailAndPassword(email, password); в этом. Поведение должно быть следующим:

  • Пользователь отправляет имя пользователя, адрес электронной почты и пароль
  • Отправляет httpsCallable в функции
  • Функции проверяют, если Пользователь существует и возвращает ошибку, если нет
  • Если пользователь существует, выведите ошибку, если нет createUserWithEmailAndPassword и зарегистрируйте нового пользователя в Cloud Firestore

Если это поможет, я ' м, используя ReactJS с Гэтсби для внешнего интерфейса.

1 Ответ

0 голосов
/ 04 мая 2020

Вы можете создать пользователя в облачной функции, как показано ниже,

exports.checkUser = functions.https.onCall(async (data, context) => {
    // Uses the username from the data to compare it to the doc
    const usernameExists = await admin
        .firestore()
        .collection('users')
        .doc(data.username)
        .get();

    // Check the the username passed exists
    if (usernameExists.exists) {
        //If the username that is passed exists, we want to repond with an error
        throw new functions.https.HttpsError(
            'already-exists',
            'This username is already taken. Please try another one.'
        );
    } else {
        const newUser = await admin
            .auth()
            .createUser({ email: data.email, password: data.password });

        await admin
            .firestore()
            .collection('users')
            .doc(data.username)
            .set({ userId: newUser.uid });

        return {
            success: true,
            data: data,
        };
    }
});

На стороне клиента зарегистрируйте пользователя при успешном создании пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...