5

Co chcę zrobić, to złapać błąd 302, co oznacza, że ​​użytkownik nie jest zalogowany, a następnie przekierować tego użytkownika na stronę logowania do witryny. Oto mój backbone.js synchronizacji nadpisanie teraz:Złapanie błędu 302, a następnie przekierowanie w metodzie synchronizacji 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") 

Błąd 302 jest zdecydowanie dzieje, widzę go w widoku sieciowym kiedy sprawdzać stronę przy użyciu przeglądarki Google Chrome. Jednak gdy ustawię punkt przerwania, nigdy nie trafi do połowy, a argument błędu jest niezdefiniowany. Czy to dlatego, że 302 nie jest prawdziwym błędem (jest żółty, gdy widzę status odpowiedzi, zamiast zwykłej czerwieni dla błędów, lub gdzieś go pomieszam.)

Odpowiedz

9

Domyślna Backbone.sync nie podnosi wyjątek, gdy żądanie AJAX zwraca stan błędu (i tak, 302 jest błąd), pozostawia obsługi błędów do $.ajax domyślny synclooks like this:

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

i Backbone.ajax jest tylko $.ajax; uwagę, że powyższe jest. Obecny główny oddział Backbone, obecnie wydana wersja używa bezpośrednio $.ajax.

Co chcesz zrobić, to wymienić Backbone.sync z czymś, co zawsze wymusza obsługi błędu takiego:

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 

Coś jak to powinno załatwić sprawę:

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) 

Jeśli używasz główny oddział kręgosłupa (lub czytający to po Backbone.ajax jest w wydanej wersji), możesz zastąpić Backbone.ajax czymś, co wymusza obsługę błędów, jak powyżej, i pozostawić tylko Backbone.sync.

+0

Dzięki za odpowiedź, a Twoje rozwiązanie prawie działa. Otrzymuję status 200 dla xhr.status. Jest to tylko jeden plik aplikacji/json, który rzuca błąd 302, a metoda inicjatora to jquery.min.js, jeśli któraś z nich pomaga. EDYCJA: Jest również wyrzucane na POST. – prashn64

+0

@ prashn64: Nie widzę niczego, co zostanie rzucone i mogę uzyskać 302 w 'xhr.status'. Zabrałeś to gdzie indziej i załatwiłeś sprawy, prawda? –

+0

Ahh, tak, postanowiłem zrobić coś trochę inaczej, używając tras wyszukiwarki Google, wyjaśnię to rozwiązanie w przyszłym tygodniu. – prashn64

Powiązane problemy