使用模拟器运行第二代Firebase onCall函数遇问题:httpsCallableFromURL无效
问题原因
connectFunctionsEmulator 仅对通过 httpsCallable 创建的函数调用生效——它会修改Functions实例的默认调用地址。而 httpsCallableFromURL 是直接传入了线上函数的固定URL,模拟器配置无法覆盖这个硬编码的地址,导致开发环境下依然请求线上服务,而非本地模拟器。
解决方案
有两种可行的处理方式:
方式一:环境区分URL
在开发环境下,将函数URL替换为本地模拟器的地址,生产环境保留线上URL。示例代码修改如下:
const isDev = process.env.NODE_ENV === 'development'; // 模拟器地址格式:http://localhost:5001/{你的项目ID}/{地区}/{函数名} const helloWorldUrl = isDev ? 'http://localhost:5001/你的项目ID/us-central1/helloWorld' : 'https://hello-cp54mvsyeq-uc.a.run.app'; export const helloWorld = httpsCallableFromURL<unknown, THelloResponse>( functions, helloWorldUrl );
注意替换其中的你的项目ID和地区为实际值,函数名要和本地模拟器中运行的函数一致。
方式二:开发环境改用httpsCallable
既然connectFunctionsEmulator对httpsCallable生效,开发环境下直接用这个方法调用函数,生产环境再切换为httpsCallableFromURL(如果有必要的话):
let helloWorld; if (process.env.NODE_ENV === 'development') { // 直接用函数名调用,模拟器会自动路由到本地地址 helloWorld = httpsCallable<unknown, THelloResponse>(functions, 'helloWorld'); } else { helloWorld = httpsCallableFromURL<unknown, THelloResponse>( functions, 'https://hello-cp54mvsyeq-uc.a.run.app' ); } export { helloWorld };
额外注意:确认本地模拟器已正常启动,运行firebase emulators:start后,检查Functions模拟器是否在5001端口监听,且函数名与代码中使用的一致。
内容的提问来源于stack exchange,提问作者Lasharela
相关产品推荐
相关产品推荐

