如何连接两个表并获取firebase中child的所有数据

时间:2018-01-12 08:32:27

标签: node.js firebase firebase-realtime-database

我想从firebase db中的两个表中获取数据 第一张表是

enter image description here

从这里我想根据hospital_fk

从表中获取下一个数据

enter image description here

这是我在json上得到的结果

enter image description here

这是我获取数据的脚本..

router.get('', function(req, res){
    var booths = database.ref('booths');
    var hospital = database.ref('hospitals');

        booths.once('value', function (snapshot) {
            var dataSet = [];
            snapshot.forEach(function (childSnapshot) {

                var childKey = childSnapshot.key;
                var fk = snapshot.child(childKey).val();

                hospital.child(childSnapshot.val().hospital_fk).on('value', hospital=>{
                var childData =  _.assign(fk, hospital.val());

                    dataSet.push({
                        childKey: childKey, 
                        childData: childData
                    });

                    res.json(dataSet);
                });
            });


        });
});

现在我的问题只是第一个数据被返回并且还出现错误..说 FIREBASE警告:用户回调抛出了异常。错误:发送邮件后无法设置邮件头。

关于如何获取所有记录以及加入两个表的最佳方法的任何想法。

1 个答案:

答案 0 :(得分:1)

当您致电res.json(dataSet)时,它会设置一个标头,表明您的响应是JSON,并发送JSON。您只能在发送数据之前在响应上设置标头,因此第二次进行此调用时,Node.js将正确地抛出错误,说明它无法设置标头。

您需要做的是首先将所有已加入的数据收集到一个JSON响应中,然后在加载完所有数据后一次性发送。要执行此操作,请使用承诺列表Promise.all()

router.get('', function(req, res){
    var booths = database.ref('booths');
    var hospital = database.ref('hospitals');

    booths.once('value', function (snapshot) {
        var promises = [];
        snapshot.forEach(function (childSnapshot) {

            var childKey = childSnapshot.key;
            var fk = snapshot.child(childKey).val();

            var promise = hospital.child(childSnapshot.val().hospital_fk).once('value');

            promises.push(promise);
        });
        Promise.all(promises).then(function(snapshots) {
            var dataSet = [];
            snapshots.forEach(function(hospital) {

                var childData =  _.assign(hospital.key, hospital.val());

                dataSet.push({
                    childKey: hospital.key, 
                    childData: childData
                });

            });
            res.json(dataSet);
        });

    });
});

现在代码只有在获得所有医院数据后才调用res.json(dataSet)

您会注意到我也将您的on('value'更改为once('value',因为我怀疑您是否希望让听众保持活跃状态​​而不只是一次阅读。