Firebase Callable Cloud Function返回void导致then属性不存在报错问题
问题根因
- 调用逻辑不符合Firebase可调用函数的设计规范:
functions.https.onCall()包装后返回的是面向云函数运行时的HTTP请求处理入口,不是直接供业务代码调用的方法,它原生的入参是HTTP请求、响应对象,并不是你传入的业务数据+上下文配置,自然不存在返回可链式调用的Promise的固定逻辑,这也是你看到类型标注为(req: e.Request, resp: e.Response) => void | Promise的核心原因。 - 类型推导存在歧义:你没有显式标注可调用函数的入参、返回值类型,TypeScript无法确定该函数的所有分支都一定会返回Promise,所以会推导返回类型为联合类型
void | Promise,调用then方法时就会触发类型不匹配报错。
解决方案
方案1:抽离公共业务逻辑(推荐,兼顾本地测试、类型安全)
把核心业务逻辑从onCall包装层抽出来,单独封装成可直接调用的异步方法:
// 抽离独立的业务逻辑,显式标注入参、返回值类型 const myTestFuncLogic = async (data: YourDataType, context: functions.https.CallableContext) : Promise<{success: boolean}> => { return new Promise((resolve) => { resolve({success: true}); }); } // 云函数入口只做运行时包装 export const myTestFunc = functions.https.onCall(myTestFuncLogic);
本地测试调用时直接引入抽离的myTestFuncLogic即可:
const { myTestFuncLogic } = require('/path/to/functions/src/logic.js'); myTestFuncLogic(data, { auth: { uid: myId } }).then(r => { console.log("THIS IS THE ACTUAL RESPONSE FROM CLOUD FUNCTION", r); })
方案2:使用Firebase官方本地测试工具
如果需要完整模拟云函数的运行时环境,使用firebase-tools的本地仿真器调用可调用函数,不需要直接导入源码调用,完全模拟线上调用逻辑,不会出现类型报错。
方案3:临时类型兼容(不推荐)
如果你确实需要直接调用包装后的入口,可通过类型断言明确告知TypeScript该调用一定会返回Promise:
(myFunctions.myTestFunc(data, { auth: { uid: myId } }) as Promise<{success: boolean}>).then(r => { console.log("THIS IS THE ACTUAL RESPONSE FROM CLOUD FUNCTION", r); })
内容的提问来源于stack exchange,提问作者Willem Ghijsen
相关产品推荐
相关产品推荐

