17

我有一个带有以下 URL“http://localhost:8080/api/menu/1/featured”的主干集合对象。我正在尝试执行 fetch 操作以从 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

4 回答 4

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 请求。

于 2012-10-29T23:21:12.037 回答
6

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

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

这个线程解决了我的问题 -如何允许 CORS?

张贴者使用一些中间件来批准 PUT/GET/POST/DELETE 请求,如下所示 -

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

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

对我来说就像一个梦想一样工作,希望它对其他人也有帮助。

于 2012-08-05T08:51:37.227 回答
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 后端。

于 2012-07-03T00:08:31.257 回答
0

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

于 2012-07-12T14:03:17.970 回答