Backbone Fetch Request是OPTIONS方法

时间:2012-07-02 20:43:34

标签: javascript jquery backbone.js fetch options

我有一个Backbone Collection对象,其URL为“http:// localhost:8080 / api / menu / 1 / featured”。我正在尝试执行获取操作以从URL检索集合并解析它。但是,在服务器端,我为此请求看到的方法类型是OPTIONS。服务器只是支持GET方法。我不确定Backbone如何确定要使用的方法类型,以及为什么它有时会随机更改为OPTIONS方法类型。我正在使用Node.js服务器来处理请求。下面的代码几乎就是我所做的。

var FeaturedCollection = Backbone.Collection.extend({
    model:FeaturedContent,
    url:function () { return url_featured; },
    parse:function (response) {
        console.log(response);
        return response;
    }
});

var featuredCollection = new FeaturedCollection();
featuredCollection.fetch();

请帮助,谢谢!

4 个答案:

答案 0 :(得分:21)

已经有一段时间了,但我记得之前遇到过这个问题。这可能是两件事:默认情况下,Backbone尝试对后端执行RESTful API调用,这意味着GET,POST,PUT和DELETE。

许多后端不是使用真正的REST支持构建的,只支持GET和POST。当Backbone发送PUT或DELETE命令时,您的浏览器(而不是Backbone)会首先自动发送OPTIONS请求,以查看是否允许它发出这类请求。如果您的服务器不正确地应答,则此呼叫将失败,并且可能Backbone将不会执行任何操作。

绕过此设置Backbone.emulateHTTP = true;或让您的服务器正确回答OPTIONS调用。有关详细信息,请参阅文档:http://backbonejs.org/#Sync-emulateHTTP

另一个问题是您正在进行跨域/子域的Ajax请求,您需要正确启用CORS。这还包括正确回答OPTIONS请求。

答案 1 :(得分:5)

我遇到与OP完全相同的问题 - 使用Backbone和NodeJS通过CORS POST请求保存数据会不断发送OPTIONS http请求标头,而不会触发POST请求。

显然,CORS会对“导致用户数据产生副作用”的请求将使您的浏览器“预检”带有OPTIONS请求标头的请求,以便在实际发送您的预期HTTP请求方法之前检查批准。 https://developer.mozilla.org/en-US/docs/HTTP_access_control#Overview

这个线程解决了我的问题 - How to allow CORS?

海报使用了一些中间件来批准PUT / GET / POST / DELETE请求 -

res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
...
next();

和下一个();允许OPTIONS检查继续进行POST请求。

对我来说就像一个梦想,希望它也能帮助别人。

答案 2 :(得分:1)

Backbone.js将CRUD方法映射到HTTP。取自Backbone的源代码:

var methodMap = {
  'create': 'POST',
  'update': 'PUT',
  'delete': 'DELETE',
  'read':   'GET'
};
Backbone.sync = function(method, model, options) {
   var type = methodMap[method];

可能问题在于你的node.js后端。

答案 3 :(得分:0)

您使用的骨干版本是什么版本?我有完全相同的问题,但后来意识到我在教程中使用了旧版本的骨干(0.3.3)。升级到最新的backbone.js(0.9.2)和underscore.js(1.3.3)的链接,它作为GET发送。