首页 > 解决方案 > 通过 HTTP 触发时 Firebase Cloud Function 执行两次

问题描述

我正在尝试将 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 请求按预期工作,我在控制台中只看到一次“Hello from Firebase!”,但是当我查看函数日志时,它显示它被执行了两次。

在此处输入图像描述

我对 Firebase Cloud Functions 非常陌生,因此我们将不胜感激任何输入或建议!

标签: firebaseionic-frameworkgoogle-cloud-functions

解决方案


解决了

在这里找到的解决方案: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}`
})

然后将主体解析回函数中的对象,如下所示:

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

推荐阅读