Firebase中onCall与onRequest行为差异:调用外部API返回null
Firebase onCall 调用外部API返回null的问题解决
onCall完全支持调用外部API,你遇到的问题是代码写法不符合onCall的规范,和onCall本身是否能获取外部数据无关。
你的代码存在几个关键错误:
- onCall参数使用错误:onCall的回调参数不是
(req, res),而是(data, context),而且不需要手动处理CORS(Firebase已自动处理),你代码里的cors(req, res, ...)属于错误用法。 - 未正确执行异步请求:你把
data定义成了函数但没有调用,且axios.get是异步操作,必须用await等待结果返回。 - 返回格式不符合onCall要求:onCall不需要返回带
status的对象,直接返回数据即可;错误处理要抛出HttpsError,而非返回错误对象。
修正后的代码示例:
import functions from "firebase-functions"; import axios from "axios"; export const testFunc = functions.https.onCall(async (data, context) => { // 鉴权检查:未登录用户直接抛出错误 if (!context.auth) { throw new functions.https.HttpsError( "unauthenticated", "未登录用户无法访问该接口" ); } try { // 等待axios请求完成,获取返回数据 const response = await axios.get( "https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=100&page=1&sparkline=false&locale=en" ); // 直接返回外部API的数据 return { data: response.data }; } catch (err) { // 抛出符合onCall规范的错误信息 throw new functions.https.HttpsError( "internal", "获取外部数据失败", err.message ); } });
关键说明:
- 鉴权实现:通过
context.auth可获取用户认证信息,比如context.auth.uid,你可以在这里添加自定义的权限校验逻辑。 - 异步处理:onCall回调支持异步函数,用
await处理axios的异步请求,确保拿到数据后再返回结果。 - 错误处理:必须使用
functions.https.HttpsError抛出错误,这样客户端调用时能通过Promise的catch捕获到结构化的错误信息。
内容的提问来源于stack exchange,提问作者Oscar Berggren
相关产品推荐
相关产品推荐

