从用户名从Firebase提取UID

时间:2018-12-31 18:25:04

标签: javascript firebase firebase-realtime-database

我正在尝试从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())时返回此值: enter image description here

这是数据结构: enter image description here

当我尝试console.log(snap.val()。id)只是返回未定义状态时,为什么会这样? ID就在快照中。还要snap.key返回'users',所以我猜测我需要进一步进入数据库,但是如果下一层只是一堆uid,而我似乎无法获得uid,该怎么办呢? ?

1 个答案:

答案 0 :(得分: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
        });
    });
}