【问题标题】:Can't get CORS to work with firebase function无法让 CORS 与 firebase 功能一起使用
【发布时间】:2022-02-05 22:01:07
【问题描述】:

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

如果您想知道我遇到了什么样的错误,那么我基本上已经根据我的尝试完成了所有这些错误,但经典的是:

CORS 策略已阻止从源“https://myproject.web.app”访问“https://us-central1-myproject.cloudfunctions.net/send_mail”处的 XMLHttpRequest:无“访问权限” -Control-Allow-Origin' 标头出现在请求的资源上。

功能:

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

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: javascript firebase express cors xmlhttprequest


    【解决方案1】:

    原来问题并不像我想的那样出在函数中,而是 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      相关资源
      最近更新 更多