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

node.js - 如何联接两个表并在firebase中获取所有基于子级的数据库-LMLPHP

从这里我想从基于Hospital_fk的表中获取下一个数据

node.js - 如何联接两个表并在firebase中获取所有基于子级的数据库-LMLPHP

这是它在我的json上得到的结果

node.js - 如何联接两个表并在firebase中获取所有基于子级的数据库-LMLPHP

这是我获取数据的脚本。

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警告:用户回调引发了异常。错误:发送标头后无法设置。

关于如何获取所有记录的任何想法,以及连接两个表的最佳方法是什么。

最佳答案

调用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',因为我怀疑您想让监听器保持活动状态,而不只是读取一次。

07-25 22:19
查看更多