【问题标题】:Fetching UID from Firebase from username从用户名从 Firebase 获取 UID
【发布时间】:2019-05-28 03:49:21
【问题描述】:

我正在尝试从 Firebase 创建一个朋友列表,但不知道我哪里出错了。我有这个函数可以根据用户名输入来获取用户:

handleAddMember = () => {
    var username = prompt("Enter the person's username and press submit");
    if (username != null) {    
        this.findUsersMatchingUsername(username);
    }
}

findUsersMatchingUsername( username ) {
    let userRef = fire.database().ref('users');
    userRef.orderByChild('username').equalTo(username).once('value', snap => {
        if(snap.val()){
            console.log(snap.val());
        }else{
            alert(username + ' exists?: false');
        }
    });
}

它按预期工作,当数据库中有用户名时它返回这个 (snap.val()) :

数据结构如下:

为什么当我尝试 console.log(snap.val().id) 时它只返回未定义? id 就在快照中。同样 snap.key return 'users' 所以我猜我需要在数据库中更进一步,但是如果下一个级别只是一堆 uid 而我似乎无法获得 uid,我该怎么做?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    由于您正在执行查询,因此您总是会得到一组结果,即使它只有一个结果。如果您只打算引入一个用户,那么我建议您将用户名作为参考的一部分:

    findUsersMatchingUsername( username ) {
        fire.database().ref(`users/${username}`).once('value', snap => {
            if(snap.val()){
                console.log(snap.val());
            }else{
                alert(username + ' exists?: false');
            }
        });
    }
    

    另一方面,如果您打算让多个用户返回,然后访问每个用户的属性,那么您需要更深一层,就像您所怀疑的那样......并且要做到这一点,我会遍历他们,一些喜欢:

    findUsersMatchingUsername( username ) {
        let userRef = fire.database().ref('users');
        userRef.orderByChild('username').equalTo(username).once('value', snap => {
            let results = snap.val() ? snap.val() : {};
            if (results == {})
            {
                alert(username + ' exists?: false');
                return;
            }
            Object.keys(results).forEach( eachKey => {
                console.log(results[eachKey]);   // Print the whole object in question
                console.log(results[eachKey]['id']);   // Print just the ID of the current object
                // EDIT: Since it's double-nested, you *might* have to do something like:
                // console.log(results[eachKey][eachKey]['id']);   // Print just the ID of the current object
            });
        });
    }
    

    【讨论】:

    • 所以我刚刚为我的数据库添加了数据结构。在这种情况下,我将如何实施解决方案 1?我使用他们的用户名而不是他们的用户名来保存用户,这样就行不通了?解决方案 2 会是唯一的选择吗?
    • 啊啊啊啊!!等我明白了。我循环浏览快照并在此之后获取 snap.key。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2018-04-22
    • 2016-09-30
    • 2018-10-14
    • 1970-01-01
    • 2017-12-14
    • 2018-02-08
    相关资源
    最近更新 更多