JavaScript中Firestore多查询后Promise.then有数据但await返回undefined问题
问题原因
- 你定义的
getPeers异步函数没有显式返回query.get()产生的Promise对象,函数执行默认返回空值,所以await调用拿到的结果就是undefined。你在.then()回调里的return是把值传给Promise链的下一个节点,不是作为getPeers函数的返回值。
修复方案
有两种常用修复方式:
方式1:直接返回Promise链
在query.get()前加return,把整个Promise对象作为函数返回值:
const getPeers = async () => { let query = firestore.collection("users"); if (country !== "") query = query.where("country", "==", country); if (gender !== "") query = query.where("gender", "==", gender); if (age !== "") query = query.where("age", "==", age); if (religion !== "") query = query.where("religion", "==", religion); if (budget_low !== "") query = query.where("budget_low", ">=", Number(budget_low)); if (budget_high !== "") query = query.where("budget_high", "<=", Number(budget_high)); // 新增return把Promise返回出去 return query .get() .then((querySnapshot) => { var data = []; querySnapshot.forEach((doc) => { data.push(doc.data()); }); console.log(data); return data; }) .catch((error) => { console.log("Error getting documents: ", error); // 错误场景可根据需要返回空数组或抛出错误 return []; }); }; let d = await getPeers(); console.log(d); // 可正常拿到数据
方式2:统一用async/await语法(更推荐,避免回调嵌套)
把.then()的链式调用替换成await写法,逻辑更清晰:
const getPeers = async () => { try { let query = firestore.collection("users"); if (country !== "") query = query.where("country", "==", country); if (gender !== "") query = query.where("gender", "==", gender); if (age !== "") query = query.where("age", "==", age); if (religion !== "") query = query.where("religion", "==", religion); if (budget_low !== "") query = query.where("budget_low", ">=", Number(budget_low)); if (budget_high !== "") query = query.where("budget_high", "<=", Number(budget_high)); const querySnapshot = await query.get(); const data = querySnapshot.docs.map(doc => doc.data()); console.log(data); return data; } catch (error) { console.log("Error getting documents: ", error); return []; } }; let d = await getPeers(); console.log(d);
注意事项
- 如果需要上层代码处理查询错误,可以把catch块里的
return []改成throw error,上层调用时用try/catch包裹await语句即可捕获异常。 - 多条件组合查询如果涉及多个范围筛选条件,需要提前在Firestore控制台创建对应的复合索引,否则查询会抛出错误,按提示完成索引创建即可正常查询。
内容的提问来源于stack exchange,提问作者Abdulrahim Iliasu
相关产品推荐
相关产品推荐

