Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加应用程序/json后阻止跨源请求出错_Javascript_Node.js_Reactjs_Express_Cors - Fatal编程技术网

Javascript 添加应用程序/json后阻止跨源请求出错

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

我正在尝试使用React向节点发送一些数据。这是我的代码:

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());