捕获302错误然后重定向到backbone.js同步方法覆盖

pra*_*n64 5 redirect sync http-status-code-302 coffeescript backbone.js

我想要做的是捕获302错误,这意味着用户没有登录,然后将该用户重定向到网站的登录页面.这是我的backbone.js同步覆盖现在:

parentSynchMethod = Backbone.sync
Backbone.sync = (method, model, success, error) -> 
  try
    parentSynchMethod.apply(Backbone, arguments)
  catch error
    window.location.replace("http://localhost:8080/login")
Run Code Online (Sandbox Code Playgroud)

302肯定会发生错误,当我使用谷歌浏览器检查页面时,我可以在网络视图中看到它.但是,当我设置断点时,它永远不会进入catch,并且error参数未定义.这是因为302不是真正的错误(当我查看响应的状态时它是黄色的,而不是通常的红色表示错误,或者我在某处弄乱了代码.

mu *_*ort 10

Backbone.sync当AJAX请求返回错误条件时(默认情况下,302是错误),默认不会引发异常,它会将错误处理留给$.ajax.默认sync 看起来像这样:

Backbone.sync = function(method, model, options) {
  // A bunch of bureaucratic setup and what not...

  // Make the request, allowing the user to override any Ajax options.
  return Backbone.ajax(_.extend(params, options));
};
Run Code Online (Sandbox Code Playgroud)

而且Backbone.ajax只是$.ajax; 请注意,以上是Backbone的当前主分支,目前发布的版本$.ajax直接使用.

你想要做的是替换Backbone.sync总是强制像这样的错误处理程序的东西:

error: (xhr, text_status, error_thrown) ->
    if(xhr.status == 302)
        window.location.replace('http://localhost:8080/login')
    else
        # call the supplied error handler if any
Run Code Online (Sandbox Code Playgroud)

像这样的东西应该做的伎俩:

parentSynchMethod = Backbone.sync
Backbone.sync = (method, model, options) ->
    old_error = options.error
    options.error = (xhr, text_status, error_thrown) ->
        if(xhr.status == 302)
            window.location.replace('http://localhost:8080/login')
        else
            old_error?(xhr, text_status, error_thrown)
    parentSyncMethod(method, model, options)
Run Code Online (Sandbox Code Playgroud)

如果你正在使用Backbone的主分支(或者Backbone.ajax在发布版本之后阅读它),那么你可以用Backbone.ajax强制上面的错误处理程序的东西替换而不Backbone.sync管它.