无法让 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();
我一直在尝试部署一个功能,通过点击我的网站向我发送电子邮件,但我无法让 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();