【问题标题】:NodeJs No 'Access-Control-Allow-Origin' header is present on the requested resourceNodeJs请求的资源上不存在“Access-Control-Allow-Origin”标头
【发布时间】:2017-06-04 07:51:21
【问题描述】:

我正在尝试使用客户端浏览器上的 Ajax 请求访问 rss 提要。

$.ajax({
type: 'GET',
url: 'http://feeds.bbci.co.uk/news/business/rss.xml?edition=uk',
crossDomain: true,
dataType: 'xml',
success: function(responseData, textStatus, jqXHR) {
    console.log(responseData)
},
error: function (responseData, textStatus, errorThrown) {
    alert('failed.');
}
});

这给了我“Access-Control-Allow-Origin”错误。

我已经安装了 cors 包,所以它应该在我的服务器上启用,我错过了什么吗?

server.js 文件

var express = require('express');
var basicAuth = require('express-basic-auth')
var bodyParser = require('body-parser')
var cors = require('cors');
var app = express();

app.use(cors()); 

app.get('/', function (req, res) {
//    res.send('Hello World');
    res.sendFile(__dirname + '/views/index.html');
})

var routes = require('./routes');
app.use('/api', routes);


var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port

   console.log("App listening at http://%s:%s", host, port)
})

编辑*完整错误 XMLHttpRequest 无法加载 http://feeds.bbci.co.uk/news/business/rss.xml?edition=uk。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:8081' 因此不允许访问。

【问题讨论】:

  • 等待 - 您正在查询 feeds.bbci.co.uk,它错过了相应的 CORS 标头。然后,您需要重新配置 BBC 服务器以包含 CORS 标头,而不是您自己的...?
  • 是的,我正在查询 bbc 网络域,而不是我的节点 js 服务器。错误说 localhost 这就是为什么我很困惑这可能是我的结局?请求的资源上不存在“Access-Control-Allow-Origin”标头。原点'localhost:8081'
  • origin 标头由您的客户端发送到 BBC 服务器。然而,请求的资源是 BBC 服务器,它不回复必要的 CORS 标头。
  • Origin: localhost:8081 仅表示请求跨源资源的域。不过,这个问题对我来说很奇怪,我接受 localhost:8081 没有 CORS 问题。你确定是这个特定的请求失败了吗?
  • 是的,我 100% 确定。这让我很困惑。我可以尝试直接从我的服务器获取 rss 提要。因此,客户端将调用我的节点服务器上的端点,然后向 BBC RSS 提要发出请求。希望我不必通过我的服务器路由数据

标签: javascript node.js cors


【解决方案1】:

由于http://feeds.bbci.co.uk/news/business/rss.xml?edition=uk 不发送Access-Control-Allow-Origin 响应头,您需要改为通过代理发出请求。通过在前端 JavaScript 代码中更改 url 的值来做到这一点,如下所示:

url: 'https://cors-anywhere.herokuapp.com/http://feeds.bbci.co.uk/news/business/rss.xml?edition=uk',

https://cors-anywhere.herokuapp.com/http://feeds.bbci.co.uk/… URL 将导致请求转到 https://cors-anywhere.herokuapp.com,这是一个开放/公共 CORS 代理,然后将请求发送到您实际想要请求的 http://feeds.bbci.co.uk/… URL。

当该代理收到响应时,它会接受它并向其添加 Access-Control-Allow-Origin 响应标头,然后将其作为响应传递回您的请求前端代码。

带有Access-Control-Allow-Origin 响应标头的响应是浏览器看到的,因此浏览器现在向您显示的错误消息消失了,浏览器允许您的前端 JavaScript 代码访问响应。

或使用https://github.com/Rob--W/cors-anywhere/ 的代码或类似的代码来设置您自己的代理。

您需要代理的原因是,因为 http://feeds.bbci.co.uk/… 本身不发送 Access-Control-Allow-Origin 响应标头,您的浏览器将拒绝让您的前端 JavaScript 代码跨域访问来自该服务器的响应。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 有更多详细信息。

【讨论】:

  • 使用像cors-anywhere.herokuapp.com 这样的代理比通过我自己的网络服务器路由有优势吗?我的想法是从客户端而不是我的服务器发出请求以节省额外的数据处理
  • 使用像cors-anywhere.herokuapp.com 这样的公共代理的唯一好处是它不需要您自己在后端设置任何东西——相反,您可以将您请求的任何 URL 替换为代理的 URL。当然,如果您自己编写代理或将处理写入您自己的后端,那当然可以。
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2014-07-28
  • 2014-01-19
相关资源
最近更新 更多