【问题标题】:Firebase Cloud Function executing twice when triggered over HTTP通过 HTTP 触发时 Firebase Cloud Function 执行两次
【发布时间】:2019-08-18 03:57:08
【问题描述】:

我正在尝试将 Firebase Cloud Functions 集成到我的 Ionic 3 应用程序中。目标是创建一个云功能,该功能将使用管理 SDK 创建用户。

但是,当通过 HTTP 触发此函数时,它只会在向其传递数据时执行两次,如果我只是在没有数据的情况下调用该函数,它会按预期执行一次。

云功能代码:

const functions = require('firebase-functions');

exports.createUser = functions.https.onRequest((request, response) => {
  response.set('Access-Control-Allow-Origin', '*');
  response.set('Access-Control-Allow-Headers', 'Content-Type');
  console.log(request.body);
  response.status(200).send('Hello from Firebase!');
});

HTTP 请求:

axios.post(functionURL, {
  data: 'some data'
})
.then(res => {
  console.log(res.data);
})
.catch(err => console.log(err));

上面的 HTTP 请求按预期工作,我看到“来自 Firebase 的您好! " 在控制台中只有一次,但是当我查看函数日志时,它显示它正在执行两次。

我是 Firebase Cloud Functions 的新手,因此非常感谢任何输入或建议!

【问题讨论】:

  • 您确定客户端不会以某种方式触发它两次吗? HTTP 函数具有每个请求至少一次的保证。每个请求都会触发 0 次或 1 次。此类问题不时发布,而且始终是客户。
  • 我几乎 100% 确定您的客户在某处再次调用它...
  • 仅供参考,Cloud Functions 可能会按设计执行多次。见this code sample

标签: firebase ionic-framework google-cloud-functions


【解决方案1】:

已解决

在这里找到解决方案:Cloud Functions for Firebase triggering function on CORS preflight request

当我以application/json 发送数据时,它触发了 CORS 预检请求,这正是导致函数在传递数据时执行两次的原因。

为了绕过这个,我只是将数据作为application/x-www-form-urlencoded 字符串发送,如下所示:

const dataStr = JSON.stringify(objectToPass);

axios({
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  data: `data=${dataStr}`
})

然后在函数中将 body 解析回一个对象,如下所示:

const data = JSON.parse(request.body.data);

【讨论】:

  • 在为您自己的问题找到解决方案方面做得很好。如有可能,请将其标记为解决方案,以提高问题的可见性。
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 2020-10-26
  • 2018-06-25
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 2019-12-16
  • 2018-08-09
相关资源
最近更新 更多