gpt4 book ai didi

javascript - Cloud Functions for Firebase 在 CORS 预检请求上触发功能

转载 作者:数据小太阳 更新时间:2023-10-29 06:09:45 25 4
gpt4 key购买 nike

我有一个云功能,可以验证来自客户端表单提交的输入。我正在为 Firebase 使用 Cloud Functions https triggerscors express middleware .

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

问题

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

enter image description here

问题

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

最佳答案

要修复重复的请求 200 和 204,然后更改客户端获取请求的方式。 @sideshowbarker 是对的。浏览器会自动执行 CORS 预检选项请求,因此这在 Cloud Functions for Firebase 中不是问题。 This answer很有帮助。

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

客户端函数调用

从获取选项中完全删除了 header ,而不是将内容类型设置为 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)});

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

关于javascript - Cloud Functions for Firebase 在 CORS 预检请求上触发功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46369912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com