javascript - 为什么服务器端设置了Access-Control-Allow-Origin后仍然出现跨域错误?

标签 javascript node.js cross-domain

我刚刚运行了一个 CORS 跨源演示。该演示使用 node.js 运行。这是index.html:

<button>click to cross origin using CROS</button>
<p>hello world 😘</p>
<script>
    var btn = document.getElementsByTagName('button')[0];
    var text = document.getElementsByTagName('p')[0];
    btn.addEventListener('click', function () {
        var xhr = new XMLHttpRequest();
        var url = 'http://localhost:3001';    
        xhr.open('PUT',url,true);                
        xhr.send();                       
        xhr.onreadystatechange = () => {     
            if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {  
                text.innerHTML = xhr.response;
            }
        }
    })
</script>

这是 serverRes.js:

var express = require('express');
var app = express();
var responsePort = 3001;  
app.get('/', (req, res) => {
    res.set('Access-Control-Allow-Origin', 'http://localhost:3000'); 
    res.send("Hello world from CROS.😡");  
});

app.listen(responsePort, function () {
    console.log('cros_responser is listening on port '+ responsePort);
});

你可以看到我已经用http://localhost:3000设置了Access-Control-Allow-Origin,所以对预检请求的响应实际上应该通过访问控制检查,这意味着请求无论如何都会成功。但是当我访问端口 3000 时,我得到的是:

enter image description here

但是为什么?为什么服务器端设置了Access-Control-Allow-Origin之后仍然出现跨源错误? 另外,我尝试过写:

app.all('/', function (req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://localhost:3000');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.send("Hello world from CROS.😡");   
    next(); // pass control to the next handler
});

根据Why doesn't adding CORS headers to an OPTIONS route allow browsers to access my API? 。但错误仍然存​​在。

最佳答案

您发布的代码应该可以工作。

var express = require('express');
var app = express();
var responsePort = 3001;  


app.all("/", function(req, res, next){
  res.header('Access-Control-Allow-Origin', 'http://localhost:3000');
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  next();
});


app.get('/', (req, res) => {
    res.set('Access-Control-Allow-Origin', 'http://localhost:3000'); 
    res.send("Hello world from CROS.😡");  
});

app.listen(responsePort, function () {
    console.log('cros_responser is listening on port '+ responsePort);
});

尝试点击此 repl。

https://repl.it/@nithinthampi/WirelessGentleSigns

关于javascript - 为什么服务器端设置了Access-Control-Allow-Origin后仍然出现跨域错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58776934/

相关文章:

javascript - Event.target 在关键事件上并不精确,但在点击事件上却完美,为什么?

linux - Socket.IO 在运行时是否 fork 或生成新进程?

node.js - 在 Heroku 中使用 Docker 部署 Node.js 上的 "Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch"

javascript - 使用 Greasemonkey 脚本将框架添加到网页底部(并设置其大小)?

javascript - 使用 Jquery 将文本框值附加到 Summernote Textarea

javascript - JS 脚本未按顺序下载和评估

javascript - 如何在事件上使用带有 Socket.IO 的 RxJs

javascript - 如何在不重新加载 DOM 的情况下保持表单更新?

security - 尝试访问 iframe 内容(不同的子域);尝试设置 CORS

javascript - 跨站点 AJAX - 从 Tomcat 服务器请求数据