我一直在Chrome控制台中使用Backbone,遇到了一个我无法理解的跨域问题。
我正在连接的主机可能正确实现了CORS,因为原始XHR请求返回了预期的JSON:
var http = new XMLHttpRequest();
http.open('GET', 'http://example.com:3000/entities/item/15.json', true);
http.onreadystatechange = function(evt) { console.log(evt); }
http.send();
(在控制台上记录3个XHR进度事件,并在响应中记录正确的数据)
但是当我使用Backbone执行以下操作时,浏览器不喜欢它:
var Item = Backbone.Model.extend({});
var ItemsCollection = Backbone.Collection.extend({
model: Item,
url: 'http://example.com:3000/entities/item/'
});
var items = new ItemsCollection();
items.fetch();
(返回XMLHttpRequest cannot load http://example.com:3000/entities/item/. Origin http://localhost:8000 is not allowed by Access-Control-Allow-Origin.
)
我有什么需要告诉Backbone使用CORS吗?这个错误似乎是在浏览器发出请求之前出现的,所以我认为这不是服务器配置错误。
答案 0 :(得分:8)
我希望其中一个有帮助(我还没试过):
1. Overriding Backbone.js sync to allow Cross Origin
(function() {
var proxiedSync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options || (options = {});
if (!options.crossDomain) {
options.crossDomain = true;
}
if (!options.xhrFields) {
options.xhrFields = {withCredentials:true};
}
return proxiedSync(method, model, options);
};
})();
2。 Cross domain CORS support for backbone.js
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
options.crossDomain ={
crossDomain: true
};
options.xhrFields = {
withCredentials: true
};
});
答案 1 :(得分:6)
var PostsCollection = Backbone.Collection.extend({
initialize: function(models, options) {
//this.id = options.id;
},
url: 'http://myapi/api/get_posts/?count=8',
});
posts = new PostsCollection();
posts.fetch({
dataType: 'jsonp',
success : function (data) {
console.log(data);
}
});
关键是我们需要使用'jsonp'
答案 2 :(得分:0)
事实证明,我使用Backbone请求的URL与通过XHR请求的URL略有不同(他们缺少一个queryarg)。这导致服务器为500,没有CORS头。在调试面板的网络选项卡中,Chrome根本没有显示HTTP请求,所以我非常困惑。
将500固定在服务器上使这项工作重新开始。