我想从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警告:用户回调抛出了异常。错误:发送邮件后无法设置邮件头。
关于如何获取所有记录以及加入两个表的最佳方法的任何想法。
答案 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'
,因为我怀疑您是否希望让听众保持活跃状态而不只是一次阅读。