5

Lo que quiero hacer es detectar un error 302 que significa que un usuario no ha iniciado sesión, y luego redirigir a ese usuario a la página de inicio de sesión del sitio web. Aquí está mi Backbone.js anulación de sincronización en este momento:Capturando 302 error y redirigiendo en backbone.js método de sincronización reemplaza

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

El error 302 es, sin duda pasando, lo puedo ver en la vista de red cuando examino la página utilizando Google Chrome. Sin embargo, cuando establezco un punto de interrupción, nunca entra dentro de la captura, y el argumento de error no está definido. ¿Esto es porque 302 no es un error real (es amarillo cuando veo el estado de la respuesta, en lugar de un rojo habitual para los errores, o estoy estropeando el código en alguna parte)

Respuesta

9

El valor predeterminado Backbone.sync no levanta una excepción cuando la petición AJAX devuelve una condición de error (y sí, 302 es un error), que sale de la manipulación a $.ajax de error el valor predeterminado 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)); 
}; 

y Backbone.ajax es sólo $.ajax; tenga en cuenta que lo anterior es. la rama principal actual de Backbone, la versión actualmente publicada usa $.ajax directamente.

Lo que se quiere hacer es sustituir Backbone.sync con algo que siempre obliga a un controlador de errores como este:

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 

Algo como esto debe hacer el truco:

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) 

Si está utilizando la rama principal de Backbone (o leyendo esto después de Backbone.ajax está en la versión lanzada), entonces podría reemplazar Backbone.ajax con algo que fuerce un controlador de errores como el anterior y deje solo Backbone.sync.

+0

Gracias por la respuesta, y su solución casi funciona. Obtengo un estado de 200 para xhr.status. Solo un archivo application/json arroja el error 302 y el método iniciador es jquery.min.js si algo de eso ayuda. EDITAR: También está siendo lanzado en un POST. – prashn64

+0

@ prashn64: No veo que se arroje nada y puedo obtener un 302 en 'xhr.status'. Has llevado esto a otro lado y has solucionado las cosas, ¿correcto? –

+0

Ahh, sí, decidí hacer las cosas de forma un poco diferente usando las rutas de los motores de las aplicaciones de Google. Explicaré mi solución la próxima semana. – prashn64

Cuestiones relacionadas