当前位置: 首页 > 知识库问答 >
问题:

用React和Express阻止跨源请求

冯胤
2023-03-14

因此,当我试图使用React将数据发送到后端时,我遇到了这个错误。据我所知,我需要允许在后端和.htaccess文件中进行通信。以下是我使用的一些链接:

无“访问控制允许源”-节点/Apache端口问题

访问控制允许起源头是如何工作的?

他们两个都有代码,但都没用。

到目前为止,我的服务器端代码如下:

app.use(function (req, res, next) {
    // Website you wish to allow to connect
    // res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');

    res.setHeader('Access-Control-Allow-Origin', '*');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'POST');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

这是我的客户端代码:

sendMail(e) {
    e.preventDefault();
    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,
    };
    console.log(JSON.stringify(body));
    fetch('http://localhost:4000/', {
        method: 'POST',
        body: body,
    }).then(r => console.log(r)).catch(e => console.log(e));
}

那么我错过了什么?我没有.htaccess文件,但我都是在本地完成的,所以我不确定是否可以使用它。

在我看来,我允许我需要的一切,但我想这还不够。

如果你要标记为重复,请至少确保我的问题被答案涵盖。

共有3个答案

张献
2023-03-14

一个原因可能是您将路由用作localhost:8000而不是http://localhost:8000.

使用

http://localhost:8000

不要使用

localhost:8000
桂志诚
2023-03-14

如果你加上这个标题

res.setHeader('Access-Control-Allow-Origin', '*');

您正在使用凭据模式(意味着您正在从应用程序发送一些身份验证cookie),对于CORS规范,您不能在此模式下使用通配符*。

您应该更改您的Access-Control-允许-起源标头以匹配生成请求的特定主机

您可以更改此行:

res.header('Access-Control-Allow-Origin', '*');

res.header('Access-Control-Allow-Origin', 'the ip address');

但更一般地说,类似这样的方法应该有效:

res.setHeader('Access-Control-Allow-Origin', req.header('origin') 
|| req.header('x-forwarded-host') || req.header('referer') || req.header('host'));

此外,您甚至必须允许来自浏览器的选项请求,否则您将获得飞行前请求错误。

res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
齐修贤
2023-03-14

有一个名为cors的节点包,这使它非常简单。

$npm安装cors

const cors = require('cors')

app.use(cors())

您不需要任何配置来允许所有。

有关更多信息,请参阅Github回购协议:https://github.com/expressjs/cors

 类似资料:
  • 问题内容: 所以当我尝试使用React将数据发送到后端时,我遇到了这个错误。据我了解,我需要允许后端和文件中的通信。这是我使用的一些链接: 没有“访问控制允许来源”-节点/ Apache端口问题 [Access-Control-Allow- Origin标头如何工作?]http://codingdict.com/questions/8006) 他们两个都有代码,但是没有帮助。 到目前为止,我的服务

  • 我也在应用程序根目录中使用。htaccess文件。(waleedahmad.kd.io/node)。

  • 如何通过 ajax 从远程 url 获取内容? jQuery ajax请求被阻止,因为跨源 控制台日志 跨来源请求被阻止:同一来源策略不允许读取http://www.dailymotion.com/embed/video/x28j5hv.的远程资源(原因:CORS标头“Access-Control-Allow-Origin”缺失)。 已阻止跨源请求:同源策略不允许读取位于的远程资源http://w

  • 问题内容: 因此,我有了这个Go http处理程序,该处理程序将一些POST内容存储到数据存储中,并检索其他一些信息作为响应。在后端,我使用: 在我的firefox OS应用程序中,我使用: 传入的部分都一直如此。但是,我的回复被阻止了。给我以下信息: 我尝试了许多其他操作,但是无法从服务器获得响应。但是,当我将Go POST方法更改为GET并通过浏览器访问该页面时,我得到的数据太糟糕了。我无法真

  • 我完全被难住了。我对AngularJS非常陌生,我正试图对我的泽西服务器api进行rest调用,但我运气不好。它使用curl或高级Rest客户端(Chrome浏览器加载项)工作。然而,当我试图使用我的angularjs应用程序打我的Rest时,我重复了以下内容… 这是我的CORS过滤器... } 注册我的CORS筛选器的应用程序类

  • 问题内容: 这是我的代码: 这适用于GET请求而不是POST! 我将Apache用作服务器,并使用以下命令对其进行了配置: 在我的angularjs中,我包含在模块应用程序的配置中: 但是请求POST仍然无法正常工作! 我希望有人能提出任何想法。 问题答案: 在服务器端添加这些标头: 如果仍然无法正常工作,请发布浏览器正在发送的预检请求的详细信息。 为什么要这样做? 如果不是简单的请求(例如,表单