5

私がやりたいことは、ユーザーがログインしていないことを意味する 302 エラーをキャッチし、そのユーザーを Web サイトのログイン ページにリダイレクトすることです。これが私の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")

302 エラーは間違いなく発生しています。Google Chrome を使用してページを調べると、ネットワーク ビューで確認できます。ただし、ブレークポイントを設定すると、キャッチ内には入らず、エラー引数は未定義です。これは、302 が実際のエラーではないためですか (応答のステータスを表示すると、通常のエラーの赤ではなく黄色で表示されるか、どこかでコードを台無しにしています。

4

1 に答える 1

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

そして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

このような何かがうまくいくはずです:

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)

Backbone のマスター ブランチを使用している場合 (またはBackbone.ajaxリリース バージョンでこれを読んでいる場合)、Backbone.ajax上記のようにエラー ハンドラーを強制するものに置き換えてそのままにしておくことができますBackbone.sync

于 2012-04-19T22:51:48.360 に答える