无法让 CORS 与 firebase 功能一起使用

Can't get CORS to work with firebase function

我一直在尝试部署一个功能,通过点击我的网站向我发送电子邮件,但我无法让 CORS 工作,我已经尝试了很多很多东西。最奇怪的是,很多时候它在 google 云控制台测试和 reqbin 上工作,但我在我的网站上所能完成的最多的事情是出现错误,邮件以某种方式通过但是没有内容。

如果您想知道我得到了什么样的错误,那么我基本上已经完成了所有这些,具体取决于我尝试了什么,但经典的是:

从源 'https://myproject.web.app' 访问 'https://us-central1-myproject.cloudfunctions.net/send_mail' 处的 XMLHttpRequest 已被 CORS 策略阻止:所请求的资源上不存在 'Access-Control-Allow-Origin' header .

函数:

const functions = require('firebase-functions');

const nodemailer = require("nodemailer");

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

    res.set('Access-Control-Allow-Origin', '*');
    res.set('Access-Control-Allow-Headers', '*');
    res.set('Access-Control-Allow-Methods', 'GET, OPTIONS, POST');

    let data = req.body;

    const transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            user: 'somemail@gmail.com',
            pass: 'apassword'
        }
    });

    const mailOptions = {
        from: 'somemail@gmail.com',
        to: 'somemail@outlook.fr, somemail@hotmail.fr',
        subject: data.subject,
        text: data.text
    };

    transporter.sendMail(mailOptions, function(error, info){
    if (error) {
        console.log(error);
        res.status(400).send('Échec');
    } else {
        console.log('Email sent: ' + info.res);
        res.status(200).send('Succès');
    }
    });
});

客户端:

function send_email() {

    let sujet = document.getElementById("sujet").value;
    let texte = document.getElementById("corps").value;

    if (texte == "" && sujet == ""){
        window.alert("Veuillez remplir les champs");
        return;
    }
    if (sujet == ""){
        window.alert("Veuillez remplir le champ \"Sujet\"");
        return;
    }
    if (texte == ""){
        window.alert("Veuillez remplir le champ \"Message\"");
        return;
    }

    let xhr = new XMLHttpRequest();
    xhr.open("POST", "https://us-central1-myproject.cloudfunctions.net/send_mail");

    xhr.setRequestHeader("Content-Type", "application/json");

    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
           console.log(xhr.status);
           console.log(xhr.responseText);
        }   
    };

    let data = `{
    "subject": "",
    "text": ""
    }`;

    let json = JSON.parse(data);
    json.subject = sujet;
    json.text = texte;  

    xhr.send(json);
}

我也试过CORS中间件和express

非常感谢任何帮助,谢谢。

事实证明问题并不像我想的那样出在函数中,而是 XMLHttpRequest。切换到节点获取,一切正常。

const body = {
            "subject": ""+sujet+"",
            "text": ""+texte+""
            };

        const response = await fetch('https://us-central1-myproject.cloudfunctions.net/send_mail', {
            method: 'post',
            body: JSON.stringify(body),
            headers: {'Content-Type': 'application/json'}
        });

        const res = await response.json();