Node.js中Firebase查询特定经理下属员工信息返回空问题排查
解决Firebase查询经理下属员工时返回空对象的问题
我一眼就看出你的代码里有两个关键问题导致返回空对象,咱们一步步来解决:
问题1:forEach不支持异步等待
forEach 循环不会等待内部的异步操作完成,当你执行 return resp 的时候,里面的 admin.auth().getUser 调用还没结束,所以resp还是空的。咱们得用支持异步的循环方式,比如 map 配合 Promise.all。
问题2:错误使用了传入的emp_uid参数
你代码里直接用了函数参数的 emp_uid,但实际上每个Company文档里都有自己的emp_uid,应该从每个snap的文档数据里获取对应的员工UID,而不是用固定的参数。
修正后的代码
module.exports = { get_users: async (mng_uid) => { try { const snaps = await db.collection("Company").where("mng_uid", "==", mng_uid).get(); if (snaps.empty) { return "Oops! Not found."; } // 用map生成获取用户信息的Promise数组 const userPromises = snaps.docs.map(async (snap) => { const docData = snap.data(); try { const userRecord = await admin.auth().getUser(docData.emp_uid); return userRecord; } catch (err) { console.error(`获取员工${docData.emp_uid}信息失败:`, err); return null; // 或者根据需求返回自定义错误信息 } }); // 等待所有Promise完成,得到员工信息数组 const employees = await Promise.all(userPromises); // 可选:过滤掉获取失败的条目 return employees.filter(emp => emp !== null); } catch (err) { console.error("查询公司文档失败:", err); return "Error in retrieving employees."; } } }
关键改进点
- 统一使用
async/await写法,避免混合then/catch和async/await,代码逻辑更清晰。 - 用
map遍历文档,每个文档返回一个获取用户信息的Promise,再通过Promise.all等待所有异步操作完成,确保结果填充后再返回。 - 从每个文档的
data()中读取对应员工的emp_uid,匹配你的Firestore数据结构。 - 拆分错误处理,分别捕获文档查询和用户信息获取的异常,便于调试定位问题。
- 返回员工信息数组,比原对象结构更符合业务场景,也更易后续处理。
这样修改后,你的函数就能正确返回指定经理下属的所有员工信息啦。
内容的提问来源于stack exchange,提问作者Bhuvan Gandhi
相关产品推荐
相关产品推荐

