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

Firebase可调用函数返回值报JSON编码错误,同逻辑HTTP请求正常如何修复

问题根因
  • 异步逻辑未等待执行完成:你代码中user和vessels两个变量接收的是Firestore异步查询返回的Promise对象,而非实际查询结果。你直接在同步代码中对这两个Promise做过滤操作,不仅拿不到有效数据,未resolve的Promise相关的函数属性也会导致返回值无法序列化为JSON。
  • uid取值错误:context.auth?.uid.toString没有加括号调用,这里你拿到的是toString函数本身,而非uid字符串,也是触发JSON编码报错的原因之一。
  • 异常捕获逻辑无效:当前try/catch只能捕获同步代码的异常,异步查询过程中抛出的错误无法被捕获,无法触发你写的错误返回逻辑。
修正方案

你不想用链式Promise调用的话,直接用async/await语法就能实现「先把查询结果存入变量、再组合处理」的需求,修正后的代码如下:

exports.getFormData = functions.https.onCall( async (data, context) => {
  // 补全toString调用括号,拿到实际uid字符串
  const uid = context.auth?.uid.toString();
  try {
    // await等待异步查询完成,拿到实际用户数据
    const userDoc = await admin.firestore().doc("users/"+uid).get();
    const user = userDoc.data();

    // await等待船舶列表查询完成,拿到实际船舶数据
    const vesselsSnapshot = await admin.firestore().collection("vessels").get();
    const vessels = vesselsSnapshot.docs.map(doc => doc.data());

    // 现在两个变量都是实际的普通JS对象,可以正常做过滤处理
    const accessibleVessels = vessels.filter((vessel) => {
      return user.hasEditRights.some((right) => {
        return vessel.name === right;
      });
    });

    return accessibleVessels;
  } catch (error) {
    console.log(error);
    return {"error": true};
  }
});

可调用函数会自动等待async函数返回的Promise执行完成,再把返回的普通数组/对象序列化为JSON返回给前端,完全符合官方规范要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:36:01