当前位置: 首页 > 知识库问答 >
问题:

CORS飞行前请求Firebase触发功能的云函数

欧阳永宁
2023-03-14

我有一个云函数,它在我的客户机上验证表单提交的输入。我正在使用云函数用于带有cors express中间件的Firebase https触发器。

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);
    });

  });

});

对函数的客户端调用

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)});

问题

是否可以防止firebase在预飞行请求上触发函数调用?如果没有,那么是否有一种方法可以阻止预飞行请求并成功地将数据传递给函数。

共有1个答案

丰誉
2023-03-14

为了修复重复的请求200和204,然后改变客户端提取请求的方式。@SideShowBarker是对的。浏览器会自动执行CORS preflight OPTIONS请求,因此这在Firebase的云功能中不是一个问题。这个回答很有帮助。

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

对函数的客户端调用

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)});

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

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);
    });
  });
});
 类似资料:
  • 我有一个Spring Boot/Spring Data REST服务,允许访问许多资源。其中一些资源(例如)可以自由访问,其他资源(例如)需要基本的HTTP身份验证。通过使用CURL测试REST服务,所有工作都按预期进行。当我试图从Angular2 web应用程序访问服务时,问题就会出现。

  • 我使用AJAX请求通过POST将数据发送到另一个域。因为我的内容类型不是标准的(它是JSON格式),所以需要一个飞行前请求。(使用请求方法:选项) 如维基百科跨域XHR调用图表中所述 我想知道这是否很费时,因为浏览器将必须到达服务器两次或不?也许这取决于每个浏览器的行为? 通过使用内容类型“纯文本”来避免飞行前请求,我是否获得了一些时间?

  • 有没有办法在触发云功能之前检查用户是否经过Firebase授权?(或在函数内)

  • 我正在寻找一种为Firebase安排云功能的方法,或者换句话说,在特定的时间触发它们。

  • 问题内容: 我目前正在学习如何为Firebase使用新的CloudFunctions,而我遇到的问题是我无法访问通过AJAX请求编写的函数。我收到“没有’Access-Control-Allow-Origin’错误”。这是我编写的函数的示例: 该函数位于以下网址中:https : //us-central1-fba- shipper-140ae.cloudfunctions.net/test Fi

  • 我是这样做的: 我做错了什么?我将非常感谢任何帮助。 更新: 道格·史蒂文森的回答有所帮助。添加({origin:true})修复了此问题,我还不得不将更改为,但我一开始完全没有看到。