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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:39:03