【发布时间】:2018-03-19 08:02:28
【问题描述】:
我按照本教程进行操作,但我使用的是 nodemailer 而不是 sendgrid。
https://www.youtube.com/watch?v=wCtNjP9gcqk
我收到这个错误
对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'localhost:4200' 不允许访问。响应的 HTTP 状态代码为 500
我在互联网上尝试了几种解决方案..
我发现最符合逻辑的是这个...
https://mhaligowski.github.io/blog/2017/03/10/cors-in-cloud-functions.html
但我不断收到错误
这就是我在服务器端/firebase 上的功能..
const nodemailer = require('nodemailer');
const functions = require('firebase-functions');
const cors = require('cors')({
origin: true
});
function sendFn(req, res) {
var transporter = nodemailer.createTransport({
service: "Gmail",
auth: {
user: "user@gmail.com",
pass: "password"
}
});
var mailOptions = {
from: '', // sender address (who sends)
to: '', // list of receivers (who receives)
subject: '', // Subject line
replyTo: '',
text: '', // plaintext body
html: '' // html body
};
mailOptions['from'] = 'Contact';
mailOptions['to'] = 'address@email.com';
mailOptions['text'] = req.query.msg;
mailOptions['replyTo'] = req.query.email;;
mailOptions['subject'] = "WebContact - " + req.query.name;
// // send mail with defined transport object
return transporter.sendMail(mailOptions).then(() => {
console.log('Email sent to:');
}).catch(error => {
console.error('There was an error while sending the email:', error);
});
};
exports.httpEmail = functions.https.onRequest((req, res) => {
var corsFn = cors();
corsFn(req, res, function() {
sendFn(req, res);
});
});
这就是我在前面的内容...我正在使用 angular...
const url = `firebase.url.function`;
const params: URLSearchParams = new URLSearchParams();
const headers = new Headers({ 'Content-Type': 'application/json'. , 'Access-Control-Allow-Origin': '*'});
const options = new RequestOptions({ headers: headers });
params.set('name', data['name']);
params.set('email', data['email']);
params.set('msg', data['msg']);
console.log('Enviados' + params);
this.http.post(url, params, options)
.toPromise()
.then(res => {
console.log(res);
})
.catch(err => {
console.log(err);
});
我不知道如何在 firebase 端更改或设置 cors ...
非常感谢
----编辑----
Firebase 日志。
TypeError: Cannot read property 'headers' of undefined
at /user_code/node_modules/cors/lib/index.js:219:31
at optionsCallback (/user_code/node_modules/cors/lib/index.js:199:9)
at corsMiddleware (/user_code/node_modules/cors/lib/index.js:204:7)
at exports.httpEmail.functions.https.onRequest (/user_code/index.js:54:18)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:26:41)
at /var/tmp/worker/worker.js:635:7
at /var/tmp/worker/worker.js:619:9
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)
【问题讨论】:
-
响应的 HTTP 状态码为 500 ⬅ 这就是你需要解决的问题。您看到有关 Access-Control-Allow-Origin 标头的消息的唯一原因是,与大多数服务器一样,发送该响应的服务器不会将标头添加到 5xx 错误响应中,而只会将它们添加到 2xx 成功响应中.无论如何,那个 500 响应表明一些内部服务器故障。因此,您需要查看服务器端的服务器日志,看看记录了哪些有关导致其发送 500 响应的内部故障的消息。
-
但是我使用的是firebase函数,还是你的意思是网站服务器??
-
是的,我的意思是在您的
this.http.post(url, params, options)调用中,无论服务器在url运行 -
这是 firebase 函数 url 参数,它是一个云函数,它提供的所有日志都在我所做的新编辑中。
标签: node.js typescript firebase google-cloud-functions