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

Firebase onCall云函数嵌套调用API返回null如何解决?

问题原因:调用返回null

核心问题是云函数内嵌套的异步Promise没有被正确返回,Firebase onCall函数要求完整返回整个异步操作链的Promise,才能将最终结果传递到前端。另外你前端的传参格式也存在错误,会导致云函数无法正确读取物流ID。


1. 修复云函数异步逻辑

你原有代码中shipmentData对应的Promise没有添加return语句,外层的.then执行完没有等待物流查询请求返回就结束了,自然返回空值。
推荐改用更易维护的async/await写法,同时替换早已停止维护的request库为axios,避免安全漏洞:

// 先安装axios:npm install axios
import * as axios from 'axios';

exports.checkOrderShipment = functions.https.onCall(
  async (req: any, context: any) => {
    // 未登录拦截
    if (!context.auth) {
      return { status: 'error', code: 401, message: 'Not signed in' };
    }
    try {
      // 第一步:请求物流接口授权token
      const authRes = await axios.post('https://apiv2.shiprocket.in/v1/external/auth/login', {
        email: 'test',
        password: 'test'
      }, {
        headers: { 'Content-Type': 'application/json' }
      });
      const token = authRes.data.token;
      // 第二步:查询物流信息
      const shipmentRes = await axios.get(`https://apiv2.shiprocket.in/v1/external/courier/track/shipment/${req.shipmentId}`, {
        headers: {
          'Content-Type': 'application/json',
          Authorization: `Bearer ${token}`
        }
      });
      // 返回结果到前端
      return {
        data: {
          res: shipmentRes.data,
          req: req,
          body: shipmentRes.data
        }
      };
    } catch (error) {
      return { status: 'error', code: 500, message: error.message };
    }
  }
);

如果要保留原有request写法,只需要在shipmentData前添加return即可:

// 原有代码修改处
return shipmentData.then(function (data: any) {
  console.log('shipmentData', data);
  return data;
});

2. 修复前端传参格式

onCall函数接收的参数是对象格式,你现在直接传shipmentId字符串会导致云函数内req.shipmentId读取为undefined,修改服务层代码:

checkShipmentDetail(shipmentId){
  // 传对象而非直接传字符串
  return this.firebaseFunction.httpsCallable('checkOrderShipment')({shipmentId: shipmentId});
}

3. 仅允许授权用户访问配置

  • 你云函数开头已经添加的if (!context.auth)判断已经可以拦截所有未登录Firebase Auth的用户,未登录调用会直接返回401错误。
  • 如需进一步强化安全,可开启Firebase App Check校验,在云函数内添加如下代码,即可拦截非官方客户端的请求:
// 放在context.auth判断后即可
if (!context.app) {
  return { status: 'error', code: 403, message: 'Invalid app' };
}
  • 如要完全封锁公开调用权限,可进入Google Cloud控制台,修改该云函数的IAM权限,移除allUsers的调用权限,仅保留Firebase相关服务的调用权限即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:42:01