【问题标题】:Google Cloud HTTP function by webhook: Request body is missing dataWebhook 的 Google Cloud HTTP 功能:请求正文缺少数据
【发布时间】:2019-09-25 05:57:06
【问题描述】:

我正在将 Zoom API 与我的 Firebase 应用程序集成,为此我依靠 Zooms 预制的 webhook 在我的 Firebase 上运行 HTTP 函数来处理各种事件,例如“会议开始”和“会议结束”。缩放 API 参考:https://marketplace.zoom.us/docs/guides/webhooks

这是 Zoom API 正在调用的 Google Cloud 函数:

exports.zoomTestA = functions.https.onCall((req, res) => {
    console.log(req);
    let data = req.body;
    var xmlData = data.toString();
    console.log(xmlData);
});

这是 Zoom 发送的有效载荷:

{
  "event": "meeting.ended",
  "payload": {
    "account_id": "LTf-KjgUTR2df-knT8BVEw",
    "object": {
      "duration": 0,
      "start_time": "2019-05-07T14:02:51Z",
      "timezone": "",
      "topic": "Alexander Zoom Meeting",
      "id": "864370042",
      "type": 1,
      "uuid": "2h/SWVrrQMu7fcbpLUly3g==",
      "host_id": "Ty6ykNolSU2k1N4oc0NRcQ"
    }
  }

这会导致此错误出现在我的 Google Cloud 控制台中:

Request body is missing data. { event: 'meeting.ended',
  payload: 
   { account_id: 'LTf-KjgUTR2df-knT8BVEw',
     object: 
      { duration: 0,
        start_time: '2019-04-30T14:23:44Z',
        timezone: '',
        topic: 'Alexander\'s Zoom Meeting',
        id: '837578313',
        type: 1,
        uuid: 'WotbHO3RRpSviETStKEGYA==',
        host_id: 'Ty6ykNolSU2k1N4oc0NRcQ' } } }

Zoom 发送的请求正文未按照 Google Cloud 函数的要求包装在“data: {}”标签中。如果您可以在此处控制有效负载,我已经找到了解决此问题的方法:Dart json.encode is not encoding as needed by Firebase Function

我的问题是我无法更改 Zoom API 发送的请求。有什么方法我仍然可以在我的 Google Cloud 功能中接受请求?或者有什么办法可以改变 Zoom 发送的请求格式?我都找不到任何参考资料。

一种可能的解决方案是设置另一台服务器来接收 Zoom 的请求,将其格式化为 Google Cloud 功能规范,然后将其传递给我的 Google Cloud 功能。但是,我想避免退出 Google Cloud 生态系统。

这个问题可以在谷歌云平台上解决吗?

【问题讨论】:

  • 向我们展示您用来发送到 Firebase 的代码。
  • 我已经添加了 Firebase 函数和 Zoom 负载的代码,但如前所述,问题是我不控制 Zoom 发送的请求。

标签: node.js firebase google-cloud-functions zoom-sdk


【解决方案1】:

所以我想通了。在 Firebase / Google Cloud 函数中,您可以使用

创建 HTTP 函数

functions.https.onCall((req, res) => { var data = req.body;

functions.https.onRequest((req, res) => { var data = req.body;

不同之处似乎在于 onCall 是为在 Firebase/Google Cloud 功能环境中使用而设计的。但是,如果您想要使用外部函数,则需要使用 onRequest,因为这不需要特定的有效负载格式。

使用onRequest 解决了我所有的问题。

【讨论】:

  • 当您从 onCall 更改为 onRequest 时,req 对象略有不同。使用onCall req 本身实际上包含传递给函数的任何后置参数,而使用onRequest 您需要获取req.body。同样使用onCall 你可以返回一个JS 对象,但是使用onRequest 你需要做res.json(returnData)。刚刚在转换我自己的函数时发现了这一点,并想帮助遇到同样问题的其他人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2020-02-12
  • 2018-11-07
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多