通过HTTP触发时,Firebase Cloud Function执行两次

时间:2019-03-27 14:26:24

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

我正在尝试将Firebase Cloud Functions集成到我的Ionic 3 App中。目标是创建一个云功能,该功能将使用admin 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的问候! “在控制台中只有一次,但是当我查看函数日志时,它表明它正在执行两次。

enter image description here

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

1 个答案:

答案 0 :(得分:0)

已解决

解决方案在这里: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);