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
相关产品推荐
相关产品推荐

