如何查询firebase的多对多关系?

时间:2016-11-03 00:25:01

标签: javascript jquery promise firebase-realtime-database

这是我第一次开发SPA,我没有使用像React,Vue或Angular这样的JS框架。我的项目只使用firebase sdk和jquery来访问DOM元素。

在我的应用中,用户可以与项目相关联。从那以后,我有一个user-projectsproject-users路径来表示这种关系。

当用户登录我的应用时,我请求users/uid获取用户数据。之后,我必须获取与用户关联的项目。我将采用相关项目的ID来最终请求每个项目的数据。

我正在尝试使用here所述的承诺,但我在控制台中什么也没得到。

function loadUserProjects() {
    // Authenticated user
    var user = firebase.auth().currentUser;

    // General reference to the real time db
    var ref = firebase.database().ref();

    // Request the user data
    ref.child('users/'+user.uid).on('value').then(function(snapshot) {
        var user_data = snapshot.val(); console.log(user_data);

        // Global variable to store the id of the selected project
        project_selected_key = user_data.project_selected;

        // Get the list of associated projects
        return ref.child('user-projects/'+user.uid).on('value').then(function(snapshot) {
            console.log(snapshot);
            return snapshot;
        });
    }).then(function (projectsSnapshot) {
        console.log(projectsSnapshot);

        // List associated projects
        var project_options = '';
        projectsSnapshot.forEach(function (e) {
            project_options += '<option value="'+e.key+'">'+e.val()+'</option>';
        });
        if (! project_options) {
            project_options = '<option disabled selected value>- Ningún proyecto -</option>';
        }

        $('#project_selected').html(project_options);
    }, function(error) {
        // Something went wrong.
        console.error(error);
    });
}

我知道我必须使用一个额外的请求,因为此时<select>将填充true个值(附加请求必须查询每个项目的完整数据)。但是我没有在控制台中收到消息。

提前致谢。

之后,我需要在每个项目中定义不同级别的权限,并在将项目分配给特定用户时关联级别。最初我对实时感到非常兴奋,但似乎firebase比我想象的要复杂得多。

1 个答案:

答案 0 :(得分:0)

Firebase on()侦听器可以响应多个事件。承诺只能解决一次,这就是为什么它仅在您使用Firebase的once()操作时才可用。

return ref.child('user-projects/'+user.uid).once('value');