【问题标题】:Backbone Fetch Request is OPTIONS methodBackbone Fetch Request 是 OPTIONS 方法
【发布时间】:2012-07-03 07:01:05
【问题描述】:

我有一个主干集合对象,其 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();

请帮忙,谢谢!

【问题讨论】:

    标签: javascript jquery backbone.js fetch options


    【解决方案1】:

    已经有一段时间了,但我记得以前遇到过这个。这可能是两件事: 默认情况下,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 请求。

    【讨论】:

    • 我不认为这个答案是正确的。我对 save() 方法 + CORS 有同样的问题。我的服务器可以正确处理 CORS 调用,我也尝试使用 $.ajax 和外部 REST 接口测试器。现在我用 model.save() 发送 POST 调用,Access-Control-Request-Method 是 POST,但方法是 OPTIONS,所以我的服务器很困惑,发回 404 标头。我在服务器端使用 PHP SLIM。
    • 仅仅因为它不适合你并不意味着它没有帮助其他人。抱歉,我不太了解您的设置,可能还有很多其他问题。
    • 通过 CORS 调用,您有一个预检 OPTIONS 调用,如果您对带有 Access-Control-Allow-* 标头的 Access-Control-Request-* 标头响应不佳,那么您的原始请求将失败。那是我的问题,但我现在读到你写的一样,所以请原谅我投反对票!
    【解决方案2】:

    我遇到了与 OP 完全相同的问题 - 使用 Backbone 和 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 请求。

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

    【讨论】:

    • 怎么样:if request.method == "OPTIONS" return 200告诉前端OPTIONS请求可以被处理?我正在使用 Python 后端,但不确定是否有 next() 的等价物。
    【解决方案3】:

    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 后端。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2019-01-26
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2012-11-01
        • 1970-01-01
        相关资源
        最近更新 更多