2012-07-02 52 views
16

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

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(); 

请帮帮忙,谢谢!

回答

19

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

许多后端并没有与真正的REST支持,仅支持GET和POST建成。当Backbone发送PUT或DELETE命令时,浏览器(不是Backbone)会首先自动发送OPTIONS请求,以查看是否允许进行这类请求。如果你的服务器回答不正确,这个通话将失败,可能Backbone不会做任何事情。

为了解决这个问题设置Backbone.emulateHTTP = true;或你的服务器正确答案选项的电话。请参阅文档以获取更多信息:http://backbonejs.org/#Sync-emulateHTTP

另一个问题是您正在制作ajax请求跨域/子域,并且您需要正确启用CORS。这还包括正确回答OPTIONS请求。

+0

我不认为这个答案是正确的。我有与save()方法+ CORS相同的问题。我的服务器可以正确处理CORS调用,我试用了$ .ajax和一个外部REST接口测试器。现在我使用model.save()发送POST调用,访问控制请求方法是POST,但方法是OPTIONS,所以我的服务器很困惑并且发送404头返回。我在服务器端使用PHP SLIM。 – inf3rno

+0

只因为它不适合你,并不意味着它没有帮助其他人。对不起,我不太了解你的设置,它可能是其他许多事情。 –

+1

通过CORS调用,您有一个预检OPTIONS调用,并且如果您对Access-Control-Request- *标题使用Access-Control-Allow- *标题没有很好响应,那么您的原始请求将失败。这是我的问题,但我现在读到你写的是相同的,所以请原谅我的投票! – inf3rno

1

Backbone.js将CRUD方法映射到HTTP。从骨干网的源代码摘自:

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

或许问题存在于你的node.js后端。

0

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

5

我有完全相同的问题,因为OP - 利用骨干网和通过的NodeJS一个CORS POST请求保存的数据将不断地发送OPTIONS HTTP请求头,而不是在所有触发POST请求。

很明显,对于会导致用户数据副作用的请求,CORS会让你的浏览器在发送你想要的HTTP请求方法之前用OPTIONS请求头“预检”请求头来检查批准。 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请求。

工作就像我的一个梦想,希望它可以帮助别人了。

+0

如何做这样的事情:'如果request.method ==“OPTIONS”返回200'告诉前端** ** OPTIONS请求可以被处理?我正在使用Python后端,并且不确定是否存在** next()**的等价物。 – benjaminz