Javascript 添加应用程序/json后阻止跨源请求出错
我正在尝试使用React向节点发送一些数据。这是我的代码:Javascript 添加应用程序/json后阻止跨源请求出错,javascript,node.js,reactjs,express,cors,Javascript,Node.js,Reactjs,Express,Cors,我正在尝试使用React向节点发送一些数据。这是我的代码: sendMail(e) { e.preventDefault(); // fetch('/https://uczsieapp-mailer.herokuapp.com/', { var name = document.getElementById('name').value; var contactReason = document.getElementById('contactReason').valu
sendMail(e) {
e.preventDefault();
// fetch('/https://uczsieapp-mailer.herokuapp.com/', {
var name = document.getElementById('name').value;
var contactReason = document.getElementById('contactReason').value;
var email = document.getElementById('email').value;
var additionalInfo = document.getElementById('additionalInfo').value;
var body = {
name: name,
contactReason: contactReason,
email: email,
additionalInfo: additionalInfo,
};
body = JSON.stringify(body);
console.log(body);
fetch('http://localhost:4000/', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
content: body,
}).then(r => console.log(r)).catch(e => console.log(e));
}
这是我的节点代码:
var cors = require('cors');
var app = express();
app.use(cors());
var a = '=';
router.post('/', (req, res, next) => {
console.log('mailing');
console.log(a);
a += '=';
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
host: "smtp.gmail.com", // hostname
auth: {
user: 'someuser@gmail.com',
pass: 'testgmail'
}
});
console.log(req.body.content);
let mailOptions = {
from: `${req.body.name} ${req.body.email}`, // sender address
to: 'alexander.ironside@mygeorgian.ca', // list of receivers
subject: 'Email from UczSieApp contact form', // Subject line
text: 'Hello world ', // plaintext body
html: `
<h4>Imie: ${req.body.name}</h4>
<h4>Email: ${req.body.email}</h4>
<h4>Powod kontaktu: ${req.body.contactReason}</h4>
<p>Wiadomosc: ${req.body.additionalInfo}</p>
`
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
}
);
var-cors=require('cors');
var-app=express();
应用程序使用(cors());
变量a='=';
router.post(“/”,(请求、恢复、下一步)=>{
console.log(“邮寄”);
控制台日志(a);
a+='=';
var nodeEmailer=require('nodeEmailer');
var transporter=nodeEmailer.createTransport({
主机:“smtp.gmail.com”//hostname
认证:{
用户:'someuser@gmail.com',
通过:“testgmail”
}
});
控制台日志(请求主体内容);
让邮件选项={
发件人:`${req.body.name}${req.body.email}`,//发件人地址
致:亚历山大。ironside@mygeorgian.ca“,//接收者列表
主题:“UczSieApp联系人表单中的电子邮件”,//主题行
text:'你好,世界',//纯文本正文
html:`
Imie:${req.body.name}
电子邮件:${req.body.Email}
Powod kontaktu:${req.body.contactReason}
Wiadomosc:${req.body.additionalInfo}
`
};
//使用定义的传输对象发送邮件
transporter.sendMail(邮件选项,函数(错误,信息){
如果(错误){
返回console.log(错误);
}
console.log('发送的消息:'+信息响应);
});
}
);
如您所见,我正在使用,它应该处理所有的cors
问题
但这还不够。当我去掉传递给fetch()
的headers
属性时,调用正在进行,但没有发送数据。当我添加标题时,我得到了乐趣
已阻止跨源请求:同一源策略不允许读取位于的远程资源。(原因:缺少CORS标头“访问控制允许原点”)
再次出错
我怎样才能摆脱它,我错过了什么
我在编写代码时使用了这个答案:您介意按如下方式尝试,这应该可以解决问题:
app.use(function (req, res, next) {
//set headers to allow cross origin requestt
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
事实证明CORS只允许某些特定的内容类型
内容类型标题的唯一允许值为:
应用程序/x-www-form-urlencoded
多部分/表单数据
文本/纯文本
origin参数指定可以访问资源的URI。浏览器必须强制执行此操作。对于没有凭据的请求,服务器可以将“*”指定为通配符,从而允许任何来源访问资源
好吧,这不起作用的原因有很多。我将这个答案留给未来的开发人员,以减轻他们的痛苦
这是在客户端工作的方法:
$.ajax({
type: "POST",
url: 'http://localhost:4000/',
data: body,
success: data=>{console.log(data)},
dataType: 'json',
});
以下是我的整个服务器端代码:
var express = require('express');
var router = express.Router();
var cors = require('cors');
var app = express();
app.use(cors());
app.options('*', cors());
var a = '=';
router.post('/', (req, res, next) => {
console.log('mailing');
console.log(a);
a += '=';
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
host: "smtp.gmail.com", // hostname
auth: {
user: 'sqtableknights@gmail.com',
pass: 'testgmail'
}
});
console.log(req.body);
let mailOptions = {
from: `${req.body.name} ${req.body.email}`, // sender address
to: 'alexander.ironside@mygeorgian.ca', // list of receivers
subject: 'Email from UczSieApp contact form', // Subject line
text: 'Hello world ', // plaintext body
html: `
<h4>Imie: ${req.body.name}</h4>
<h4>Email: ${req.body.email}</h4>
<h4>Powod kontaktu: ${req.body.contactReason}</h4>
<p>Wiadomosc: ${req.body.additionalInfo}</p>
`
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
}
);
module.exports = router;
不知道为什么,但它只是在没有app.options('*',cors())的情况下中断代码>参数。如果有人知道一个更好的答案,和/或看到任何安全漏洞,请留下评论,让我知道。再次感谢大家的帮助 CORS的存在是出于安全原因,考虑到CORS代码(希望)不会部署到生产环境中,我认为最好采用另一种方法,例如安装nginx(或apache,或jetty或任何其他可以反向代理调用的服务器)本地和代理您的呼叫从前端服务器到express one。我只想从网站发送电子邮件。数据库基于Firebase,因此节点将不会连接到db。CORS发生在客户端(您的react应用程序)和服务器(您的express)之间。您希望从我在代码中看到的服务器发送电子邮件,因此我的建议仍然适用。如果只允许3种类型,我是否应该更改内容类型的类型
?Access Control Allow Origin
是在服务器的响应上设置的,以便让浏览器知道哪些域可以点击它。在请求上设置此选项没有任何作用。Javascript无法绕过CORS。如果可以,这将是一个毫无意义的安全机制。此标头必须由服务器在响应中设置。@Taplar但服务器没有在响应中发送任何内容
var express = require('express');
var router = express.Router();
var cors = require('cors');
var app = express();
app.use(cors());
app.options('*', cors());
var a = '=';
router.post('/', (req, res, next) => {
console.log('mailing');
console.log(a);
a += '=';
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
host: "smtp.gmail.com", // hostname
auth: {
user: 'sqtableknights@gmail.com',
pass: 'testgmail'
}
});
console.log(req.body);
let mailOptions = {
from: `${req.body.name} ${req.body.email}`, // sender address
to: 'alexander.ironside@mygeorgian.ca', // list of receivers
subject: 'Email from UczSieApp contact form', // Subject line
text: 'Hello world ', // plaintext body
html: `
<h4>Imie: ${req.body.name}</h4>
<h4>Email: ${req.body.email}</h4>
<h4>Powod kontaktu: ${req.body.contactReason}</h4>
<p>Wiadomosc: ${req.body.additionalInfo}</p>
`
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
}
);
module.exports = router;
app.use(cors());
app.options('*', cors());