谷歌云函数:返回有效的 JSON

Posted

技术标签:

【中文标题】谷歌云函数:返回有效的 JSON【英文标题】:Google Cloud Functions: Return valid JSON 【发布时间】:2019-06-01 01:48:36 【问题描述】:

我正在尝试使用 cloud_functions 包从我的 Flutter 应用中调用 Google Cloud Function。

这是我的云函数:

export const helloWorld = functions.region('europe-west1').https.onRequest((request, response) => 
response.status(200).json(
    message: "Hello World!"
  );
);

这是我调用这个函数的颤振方法:

try 
  final dynamic resp =
      await CloudFunctions.instance.call(
    functionName: "helloWorld"
  );
  print(resp);

 on CloudFunctionsException catch (e) 
  ...
 catch (e) 
  ...
 finally 
  ...

如您所见,这是最简单的请求形式,没有任何参数。

我的问题: 对 Cloud Function 的每次调用都会导致 CloudFunctionsException。原因:“响应不是有效的 JSON 对象。”。

也许有人知道这里出了什么问题?如果我通过 Postman 或浏览器调用云函数,则返回一个有效的 JSON 对象,并且不会抛出异常。

提前致谢, 迈克尔

【问题讨论】:

【参考方案1】:

如果要使用 Flutter SDK 调用可调用函数,则需要实际定义可调用函数。现在,您正在声明一个 HTTP 函数,这并不相同。请read the documentation for callable functions 了解如何声明和实现可调用对象。

而不是这个:

functions.https.onRequest(...)

看起来像这样:

functions.https.onCall(...)

然后,您返回一个 javascript 对象以转换为 JSON,而不是使用响应对象。

【讨论】:

这正是我根据模块文档首先所做的 - 抛出相同的异常:export const helloWorld = functions.https.onCall((data, context) => return message: "Hello World" );【参考方案2】:

我可以找到错误: 一旦您定义了默认区域的另一个区域,flutter 包 cloud_functions 似乎无法再找到该功能:

作品:

export const helloWorld = functions.https.onCall((data, context) => 
    return 
        message: "Hello World"
    
);

不起作用:

export const helloWorld = functions.region('europe-west1').https.onCall((data, context) => 
    return 
        message: "Hello World"
    
);

【讨论】:

如果你改变了函数定义中的区域,你也改变了它的url。功能客户端 SDK 不知道您已完成此操作,因此您需要告诉它区域,以便它可以正确构建 URL。在 android 中,您使用getInstance(region) 更改区域。不知道在 Flutter 上是如何工作的,大概类似。 目前这个包似乎不支持 - 我会在 GitHub 上推荐它。感谢您的投入! 这里有同样的问题,你有没有得到关于这个@Michael 的任何更新? 谢谢@Michael!拯救了我的夜晚! 看起来已修复github.com/FirebaseExtended/flutterfire/issues/577【参考方案3】:

我遇到了同样的问题,对我有用的是:

(添加到@Michael 的答案)

声明调用云函数时,在这两种情况下都指定区域很重要。

我的错误是我只在函数声明上设置了区域代码。

更多:https://firebase.google.com/docs/functions/locations#client-side_location_selection_for_callable_functions。

对于 Flutter,您应该在单例 CloudFunctions 的 region 参数中指定区域:

CloudFunctions(app: FirebaseApp.instance, region: "europe-west1")

【讨论】:

以上是关于谷歌云函数:返回有效的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Android 谷歌云视觉 API 获取 Json 并使用 Json 去另一个活动

谷歌云函数完成执行但从不进入回调

谷歌云函数抛出 404 错误

谷歌云 KMS:加密有效但解密失败

谷歌云获取存储桶 - 适用于 cli 但不适用于 python

谷歌云功能在访问实时数据库时返回 204 状态