ограничение уникального имени пользователя в firestore с использованием вложенных обещаний - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь добиться ограничения уникального имени пользователя в firestore. Я экспериментировал и не мог справиться с этим должным образом. Я хочу создать запись аутентификации firebase после того, как убедитесь, что имя пользователя не занято, и создать запись firestore. Сначала я попытался вложить then() (для создания записи авторизации) в другую then() (проверка имени пользователя внутри БД), но это стало очень грязно. Как видите, я даже экспериментирую с if() и else. Я был бы признателен, если бы кто-то дал понимание.

export const signUp = (newUser) => {
    return (dispatch, getState, {getFirebase, getFirestore}) => {
        const firebase = getFirebase();
        const firestore = getFirestore();
        const user = firestore.collection("users").where("username", "==", newUser.username).get();
        if (!user) {
            firebase.auth().createUserWithEmailAndPassword(
                newUser.email,
                newUser.password
            ).then((response) => {
                return firestore.collection("users").doc(response.user.uid).set({
                    firstName: newUser.firstName,
                    lastName: newUser.lastName,
                    username: newUser.username,
                    createdAt: new Date()
                })
            }).then(() => {
                dispatch({type: "SIGNUP_SUCCESS"});
            }).catch((err) => {
                dispatch({type: "SIGNUP_ERROR", err});
            });
        } else {
            dispatch({type: "SIGNUP_ERROR", err: {message: "username taken"}});
        }
    }
};

1 Ответ

1 голос
/ 03 марта 2020

Найден способ обработки уникальных имен пользователей путем проверки коллекции «users» в firestore.

export const signUp = (newUser) => {
    return (dispatch, getState, {getFirebase, getFirestore}) => {
        const firebase = getFirebase();
        const firestore = getFirestore();
        let exists = null;
        let message = null;
        firestore.collection("users")
            .where("username", "==", newUser.username)
            .get()
            .then((snapshot) => {
                if (!snapshot.empty) {
                    exists = true;
                    message = "Username you chose is unavailable";
                }
            })
            .then(() => {
                if (!exists) {
                    return firebase.auth().createUserWithEmailAndPassword(
                        newUser.email,
                        newUser.password
                    );
                }
            }).then((response) => {
            return firestore.collection("users").doc(response.user.uid).set({
                firstName: newUser.firstName,
                lastName: newUser.lastName,
                username: newUser.username,
                createdAt: new Date()
            })
        }).then(() => {
            dispatch({type: "SIGNUP_SUCCESS"});
        }).catch((err) => {
            if (message) {
                dispatch({type: "SIGNUP_ERROR", err: {message}});
                message = null;
            } else {
                dispatch({type: "SIGNUP_ERROR", err});
            }
        });
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...