Firebase可调用云函数本地模拟器调用报INVALID_ARGUMENT错误如何解决
问题根源
你调用的是functions.https.onCall()类型的可调用云函数,这类函数是Firebase专门为客户端SDK封装的接口,有强制的调用协议要求,不支持浏览器直接GET访问:
- 可调用云函数要求请求必须为POST方法
- 请求头必须包含
Content-Type: application/json - 请求体必须为
{"data": 你要传入的参数}的固定格式
你直接在浏览器地址栏输入地址访问,默认发送的是无请求体的GET请求,完全不符合协议要求,所以会返回INVALID_ARGUMENT错误。
代码隐藏问题
你贴出的代码本身存在两处逻辑错误,你反馈线上部署后调用正常,大概率是实际运行的代码和贴出的内容不一致:
- onCall函数的第一个入参
data已经是Firebase自动解析完成的JS对象,不需要手动执行JSON.parse(data),如果传入参数不是JSON字符串,这一步会直接抛出异常 JSON.parse()的入参要求是JSON格式字符串,你直接传入{const1: "AAA", const2: "BBB", const3: "CCC"}这个JS对象,这一行本身就会执行报错。
本地测试方案
根据你的需求选择对应方案即可:
- 如果你需要支持浏览器直接访问,把函数修改为
functions.https.onRequest()类型的普通HTTP函数,自行处理请求和响应逻辑 - 如果你需要保留
onCall类型:- 方案一:使用Postman等接口调试工具发送POST请求,地址填本地模拟器的函数地址,请求头设置
Content-Type: application/json,请求体填入{"data": {你要传入的参数}}即可调用 - 方案二:使用Firebase自带的函数shell测试,终端执行
firebase functions:shell,启动后直接输入testfunction({你的参数})回车即可完成调用,不需要构造HTTP请求 - 方案三:在应用代码中配置客户端SDK连接本地模拟器,复用线上的调用逻辑测试
- 方案一:使用Postman等接口调试工具发送POST请求,地址填本地模拟器的函数地址,请求头设置
内容的提问来源于stack exchange,提问作者Kubaguette The Testobun
相关产品推荐
相关产品推荐

