我想从firebase db中的两个表中获取数据
第一张桌子是
从这里我想从基于Hospital_fk的表中获取下一个数据
这是它在我的json上得到的结果
这是我获取数据的脚本。
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'
,因为我怀疑您想让监听器保持活动状态,而不只是读取一次。