5

Quello che voglio fare è catturare un errore 302 che significa che un utente non ha effettuato l'accesso e quindi reindirizzare quell'utente alla pagina di accesso del sito. Ecco il mio backbone.js esclusione di sincronizzazione in questo momento:Catching 302 error e quindi reindirizzamento nel metodo di sincronizzazione backbone.js override

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

L'errore 302 è sicuramente accadendo, posso vederlo nella vista di rete quando ho ispezionare la pagina utilizzando Google Chrome. Tuttavia, quando imposto un punto di interruzione, non entra mai nell'intersezione e l'argomento dell'errore non è definito. Questo perché 302 non è un errore reale (è giallo quando visualizzo lo stato della risposta, invece di un normale rosso per errori o sto incasinando il codice da qualche parte.

risposta

9

Il valore predefinito Backbone.sync non genera un errore eccezione quando la richiesta AJAX restituisce una condizione di errore (e sì, 302 è un errore), lascia la gestione al $.ajax errore l'impostazione predefinita 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)); 
}; 

e Backbone.ajax è solo $.ajax; notare che quanto sopra è. l'attuale ramo principale di Backbone, la versione attualmente rilasciata utilizza direttamente $.ajax.

Che cosa si vuole fare è sostituire Backbone.sync con qualcosa che costringe sempre un gestore di errore come questo:

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 

Qualcosa del genere dovrebbe fare il trucco:

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) 

Se stai usando il ramo principale di Backbone (o la lettura di questo dopo Backbone.ajax è nella versione rilasciata), quindi è possibile sostituire Backbone.ajax con qualcosa che impone un gestore di errori come sopra e lasciare Backbone.sync da solo.

+0

Grazie per la risposta, e la soluzione quasi funziona. Sto ottenendo uno stato 200 per xhr.status. È solo un file application/json che genera l'errore 302 e il metodo initiator è jquery.min.js se ciò è di aiuto. EDIT: è anche essere gettato su un post. – prashn64

+0

@ prashn64: Non vedo niente lanciare e posso ottenere un 302 in 'xhr.status'. L'hai portato altrove e hai sistemato le cose, giusto? –

+0

Ah, sì, ho deciso di fare le cose in modo un po 'diverso usando le rotte del motore delle app di google, spiegherò la mia soluzione la prossima settimana. – prashn64

Problemi correlati