You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Firebase多节点关联查询结果结构优化问题

解决Firebase关联查询后数据结构合并问题

你当前的问题出在把每条booking记录的三个关联查询拆成了独立的Promise,导致最终返回的数组里是三个分开的对象,而非每条booking记录对应一个整合了所有关联数据的对象。咱们调整一下代码逻辑,就能得到你想要的结构:

修改后的完整代码

var bookinghistory = database.ref('bookingHistory');
var hospital = database.ref('hospitals');
var client = database.ref('clients');
var patient = database.ref('patients');

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

  snapshot.forEach(function (childSnapshot) {
    var childKey = childSnapshot.key;
    var bookingData = childSnapshot.val();

    // 为当前booking记录创建一个Promise,并行获取所有关联数据
    const bookingPromise = Promise.all([
      hospital.child(bookingData.hospital_fk).once('value'),
      client.child(bookingData.client_fk).once('value'),
      patient.child(bookingData.patient_id).once('value')
    ]).then(([hospitalSnap, clientSnap, patientSnap]) => {
      // 合并所有数据到单个对象
      return {
        childKey: childKey,
        bookhistory: bookingData,
        hospital: hospitalSnap.val(),
        client: clientSnap.val(),
        patient: patientSnap.val()
      };
    });

    promises.push(bookingPromise);
  });

  // 等待所有booking记录的查询完成,返回整合后的数组
  Promise.all(promises).then(function(dataSet) {
    res.json(dataSet);
  }).catch(err => {
    // 增加错误处理,避免请求挂起
    res.status(500).json({error: err.message});
  });
});

关键修改说明

  • 合并Promise逻辑:不再为每个关联查询单独创建Promise,而是为每条booking记录创建一个Promise,内部用Promise.all并行执行三个关联查询,确保三个数据都返回后再合并成一个对象。
  • 数据整合:通过解构赋值获取三个查询的快照结果,直接把hospital、client、patient的数据合并到当前booking记录的对象中,保证结构统一。
  • 错误处理:新增了全局的错误捕获,避免某个查询失败导致整个请求无响应。

最终返回结构

修改后你会得到期望的结构:

[ {
  "childKey": "-L2snm8lhye",
  "bookhistory": {/* 原bookingHistory的字段 */},
  "hospital": {
    "address": "Rizal Drive cor. ",
    "city": "",
    "createdAt": "2018-01-14 23:01:32",
    "deletedAt": "",
    "latitude": "14.554928",
    "longitude": "1115",
    "name": "St. Luke's Medical Center - Global City",
    "province": "",
    "updatedAt": ""
  },
  "client": {
    "createdAt": "2018-01-15",
    "firstName": "",
    "identifier": "+63933000000",
    "lastName": ""
  },
  "patient": {
    "birthdate": "1993-01-15",
    "client_fk": "qFUJT05B19NgQ2",
    "createdAt": "2018-01-15 15:02:13",
    "deletedAt": "",
    "firstName": "Eric",
    "gender": "1",
    "lastName": "Odulio",
    "updatedAt": ""
  }
} ]

内容的提问来源于stack exchange,提问作者Lion Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:38:14