Как проверить, какая конкретная строка получена из базы данных Firebase, чтобы отфильтровать, какие данные получены? - PullRequest
0 голосов
/ 22 октября 2018

Объясняя мой код ниже, я пытаюсь увидеть, равен ли userType admin, и установить его как user или admin.К сожалению, мое условие if не работает, и я не знаю, как перейти к оператору else.В настоящее время я вошел в фиктивную электронную почту пользователя.

Here is an image of my database structure.

firebase.auth().onAuthStateChanged((user) => { 
    console.log(user.email);
    console.log(user.uid);
    var standardUserType = "user";
    //firebase().database().ref('adminUIDs').equalTo(user.uid);
    //firebase().database().ref().child('accounts').child(user.uid).orderByChild('userType').equalTo(standardUserType).on("value", function(snapshot) {
    firebase().database().ref('adminUIDs').equalTo(user.uid).on("value", function(snapshot) {
        if (snapshot.exists() && user) {
            console.log("[admin] user data has been pushed to database");
            firebase.database().ref().child('accounts').child(user.uid).set({
                email: user.email,
                userId: user.uid,
                userType: "admin"
            })
        }else{
            console.log("[user] user data has been pushed to database");
            firebase.database().ref().child('accounts').child(user.uid).set({
                email: user.email,
                userId: user.uid,
                userType: "user"
            })
        }
        });
    console.log(checkUserType);

});

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вы пытаетесь найти узел с ключом , который вы знаете.Для этого вам не нужен запрос, но вы можете использовать прямой поиск (который также имеет то преимущество, что он происходит с фиксированной скоростью, не зависящей от количества дочерних узлов в adminUIDs).

Код для этого:

firebase().database().ref('adminUIDs').child(user.uid).on("value", function(snapshot) {
    firebase.database().ref().child('accounts').child(user.uid).set({
        email: user.email,
        userId: user.uid,
        userType: snapshot.exists() ? "admin" : "user"
    })
});

Я также упростил ваше условие if в троичное выражение, чтобы уменьшить количество дублирующегося кода.

0 голосов
/ 22 октября 2018

К сожалению, мое условие if не работает, и я понятия не имею, как перейти к оператору else

Это означает, что (snapshot.exists() && user) всегда оценивается как true, хотя на самом деле выне хочу (хотя бы один раз, я полагаю).

При каждом входе в систему onAuthStateChanged будет запускаться с ненулевым пользовательским объектом.Но это часть snapshot.exists(), которую, вероятно, нужно изменить, чтобы точнее отражать то, что вы пытаетесь сделать.

Документы для snapshot.exists say "Возвращает true, если этоDataSnapshot содержит любые данные. Это немного более эффективно, чем использование snapshot.val ()! == null ".

Глядя на изображение из структуры вашей базы данных, кажется, что даже когда isAdmin ложно, этоpath, adminUIDs/{theUserID} будет по-прежнему иметь некоторое ненулевое значение , в частности, {isAdmin: false}.

Таким образом, изменение (snapshot.exists() && user) на (snapshot.exists() && user && snapshot.val().isAdmin) может помочь.

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