用于基于CORS预检请求的Firebase触发功能的云功能

Cel*_*lso 6 javascript cors firebase google-cloud-functions

我有一个云功能,可以验证客户端表单提交的输入.我正在使用Cloud Functions for Firebase https触发器cors表达中间件.

Firebase功能

const functions = require('firebase-functions');
const express = require('express');
const cors = require('cors')({origin: true});
const validateImageForm = require('./library/validate-image-form');

exports.apiValidateImageForm = functions.https.onRequest((req, res) => {

  cors(req, res, () => {

    validateImageForm(req.body.formInputs, req.body.imageStatus).then((data) => {
      res.status(200).send(data);
    });

  });

});
Run Code Online (Sandbox Code Playgroud)

客户呼叫功能

const validateImageFormFetchOptions = {
   headers: {
     'Accept': 'application/json',
     'Content-Type': 'application/json'
   },
   method: 'POST',
   body: JSON.stringify({
     formInputs: formInputs
   })
}

fetch('https://project-url.cloudfunctions.net/apiValidateImageForm', validateImageFormFetchOptions)
 .then(response => response.json())
 .then(serverErrors => {console.log(serverErrors)});
Run Code Online (Sandbox Code Playgroud)

问题

当我使用获取请求从我的客户端调用此函数时,我在函数日志中看到两个apiValidateImageForm触发器.第一个是状态204,我认为这来自检查原点的cors预检请求.最终请求是状态200.当我获取apiValidateImageForm函数时,我只想要一个函数触发器.我担心随着时间的推移,输出状态204的预检请求会为我的项目配额添加不必要的函数调用.

在此输入图像描述

是否可以阻止firebase触发预检请求的函数调用?如果没有,那么有没有办法阻止预检请求并成功将数据传递给函数.

Cel*_*lso 6

要修复重复请求200和204,请更改您的客户端获取请求的方式.@sideshowbarker是对的.浏览器会自动执行CORS预检OPTIONS请求,因此这不是Cloud Functions for Firebase中的问题.这个答案很有帮助.

为了修复预检,我将代码更改为以下内容:

客户呼叫功能

完全从提取选项中删除了标题,而不是将内容类型设置为application/json.默认情况下,获取请求内容类型为application/x-www-form-urlencoded; 字符集= UTF-8.

const validateImageFormFetchOptions = {
  method: 'POST',
  body: JSON.stringify({
   formInputs: formInputs
  })
}

fetch('https://project-url.cloudfunctions.net/apiValidateImageForm', validateImageFormFetchOptions)
  .then(response => response.json())
  .then(serverErrors => {console.log(serverErrors)});
Run Code Online (Sandbox Code Playgroud)

Firebase功能

显式解析请求正文,因为它现在作为文本字符串接收.

const functions = require('firebase-functions');
const express = require('express');
const cors = require('cors')({origin: true});
const validateImageForm = require('./library/validate-image-form');

exports.apiValidateImageForm = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    const body = JSON.parse(req.body);
    validateImageForm(body.formInputs, body.imageStatus).then((data) => {
      res.status(200).send(data);
    });
  });
});
Run Code Online (Sandbox Code Playgroud)