NodeJs No' Access-Control-Allow-Origin'标头出现在请求的资源上

时间:2017-06-03 22:43:27

标签: javascript node.js cors

我正在尝试使用客户端浏览器上的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。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://localhost:8081'因此不允许访问。

1 个答案:

答案 0 :(得分:3)

由于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/…网址会导致请求转到https://cors-anywhere.herokuapp.com,这是一个开放/公共CORS代理,然后将请求发送到您实际要申请的http://feeds.bbci.co.uk/…网址。< / p>

当该代理获得响应时,它会接受并向其添加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有更多详情。