Firebase Functions查询参数持续为空,函数运行正常该如何排查?
问题原因
你混用了Firebase两种不同的云函数调用协议,参数传递逻辑不匹配,所以无法读取到传入的参数:
- 你后端定义的是普通HTTP触发云函数,使用
functions.https.onRequest声明,这种函数的入参只会存放在request.query(GET请求的URL查询参数)或者request.body(POST请求的请求体)中,只能通过标准HTTP请求调用。 - 你前端使用的
firebase.functions().httpsCallable()是Firebase封装的可调用云函数专用调用方法,仅适配使用functions.https.onCall声明的云函数,它的传参走Firebase私有协议,不会写入request.query字段,所以你打印该字段自然为空。
解决方案
方案1:修改后端云函数为可调用类型(推荐,适配你现有前端写法)
直接调整云函数的声明方式,从onRequest改成onCall即可正常读取参数:
exports.message = functions.https.onCall((data, context) => { functions.logger.log("log query"); functions.logger.log(data); // 这里可以直接拿到你前端传入的 {text:"asdfasdf"} return {result: `done`}; });
注意:你现有前端代码中调用
message()时没有加await,不会等待云函数返回结果,需要改成await message({text:"asdfasdf"})才能正常接收返回值。
方案2:保留后端HTTP函数,前端使用标准HTTP请求调用
不修改后端代码的话,前端不要用httpsCallable,直接发起标准HTTP请求即可,比如GET请求把参数拼到云函数URL后面:
// 替换为你自己的云函数地址,结构为 https://<部署区域>-<项目ID>.cloudfunctions.net/message const functionUrl = "https://us-central1-your-project-id.cloudfunctions.net/message?text=asdfasdf"; const res = await fetch(functionUrl); const result = await res.json();
这时候后端的request.query.text就能正常读取到参数值。
内容的提问来源于stack exchange,提问作者polar
相关产品推荐
相关产品推荐

