在 Flutter 中调用 Firebase 函数时出现 CloudFunctionsException

Posted

技术标签:

【中文标题】在 Flutter 中调用 Firebase 函数时出现 CloudFunctionsException【英文标题】:CloudFunctionsException when calling Firebase Function in Flutter 【发布时间】:2019-11-23 17:20:07 【问题描述】:

我正在尝试从我的 Flutter 项目中调用 Firebase 函数。在我的 pubspec.yaml 文件中,我导入了函数 import:cloud_functions: ^0.4.0+2。我还设置了所有 firebase 配置,因为我从我的应用程序与 firestore 数据库建立了有效连接。然后我在 javascript 中创建并部署了一个 Firebase 函数,如下所示:

exports.addEventToCalendar = functions.https.onRequest((request, response) =>
const eventData = 
    eventName: request.body.eventName,
    description: request.body.description,
    startTime: request.body.startTime,
    endTime: request.body.endTime
    ;
//more code using these variables

我已成功将此功能部署到 Firebase,并使用以下 JSON 数据在 Google Developer Console 中成功运行和测试:


"eventName": "Firebase Event",
"description": "This is a sample description",
"startTime": "2019-07-18T10:00:00",
"endTime": "2019-07-18T14:00:00"

所以我知道这个功能有效。

现在当我尝试使用这种方法在我的 Flutter App 上调用它时:

void _addToCal() async 
  try 
    final HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(
      functionName: 'addEventToCalendar',
    );
    dynamic resp = await callable.call(<String, dynamic>
      "eventName": "Flutter Event",
      "description": "This is a sample description",
      "startTime": "2019-07-15T10:00:00",
      "endTime": "2019-07-15T14:00:00"
    );
   catch (e, s) 
    print(e);
    print(s);
  

我收到“CloudFunctionsException”错误的实例。

在 Firebase 方面,我查看了函数的日志,发现了几个错误,包括:TypeError: Cannot read property 'data' of undefined

感谢您的帮助,因为我是 Firebase 和 Cloud Functions 的新手。

【问题讨论】:

【参考方案1】:

您正在从 Flutter 代码中调用 callable 函数,但您在 index.js 中声明了一个常规的 HTTPS 触发函数。 Callable Cloud Functions 声明如下here:

exports.addMessage = functions.https.onCall((data, context) => 
  // ...
);

【讨论】:

当我将其更改为此时,我在 Firebase 中的函数日志显示“未处理的错误 TypeError:无法读取未定义的属性“事件名称”? 您是否更新了 Cloud Functions 以从 datacontext 读取其参数,如我链接的文档中所示? 谢谢@Frank!这是正确的答案。还需要添加返回到云函数,因为响应对象不可用。【参考方案2】:

尝试以这种方式从您的函数中获取数据:

const  body  = req;
const eventName = req.query.eventName || body.eventName || (body.data && body.data.eventName);
const description = req.query.description || body.description || (body.data && body.data.description);
const startTime = req.query.startTime || body.startTime || (body.data && body.data.startTime);
const endTime = req.query.endTime || body.endTime || (body.data && body.data.endTime);

const eventData = 
    eventName: eventName,
    description: description,
    startTime: startTime,
    endTime: endTime
    ;

【讨论】:

以上是关于在 Flutter 中调用 Firebase 函数时出现 CloudFunctionsException的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase Cloud 功能无法调用

没有创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()

从 Flutter 应用程序连接到本地 Firebase 函数模拟器时出错

将地图列表添加到 Firebase 时出错:Flutter

如何在flutter中将标记从firebase(真实数据库)检索到新的google maps api

Firebase_messaging onResume 和 onLaunch 回调不会在 Flutter 中调用