【发布时间】: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