2011-05-20 7 views

Respuesta

3

O tal vez debería usar el estado http. Actualmente he elegido el estado 403 para indicar errores de validación en el lado del servidor. Se puede encontrar más información sobre los estados aquí: http://restpatterns.org/HTTP_Status_Codes

+10

¿No debería ser un 400 (Solicitud incorrecta) en lugar de un 403 (Prohibido)? Normalmente he visto 403 utilizado cuando un usuario intenta acceder a un recurso al que no tiene permiso de acceso. –

+1

Creo que esto debería ser 422 (entidad no procesable); porque los datos enviados no son válidos, no se pudieron procesar. – sockmonk

0

Backbone.js enruta sus llamadas ajax a través de la biblioteca subyacente que tenga instalada; JQuery o Zepto. Entonces, básicamente, esta biblioteca decide qué constituye éxito y qué constituye error.

Parece que su servidor puede devolver un código de estado 403, pero eso se interpreta como un retorno exitoso. Por lo tanto, se llama a su devolución de llamada de éxito. Por lo que vale, un código de estado 403 parece extraño para devolver errores a menos que estos errores estén relacionados con la autorización.

¿Esto es lo que estabas buscando?

7

En mi código del lado del cliente, compruebo la presencia del atributo de errores y reacciono según sea necesario.

Por ejemplo, estaba usando la función Collection.create, que llama a la función de agregar de la Colección si la solicitud fue exitosa. Por lo tanto, anulé la función de agregar de mi colección para evitar que se agregue el modelo si tiene un atributo 'errores' y si no llama al método "super".

add: function(object, options) { 
    if (_.isArray(object) || !object.get('errors')) { 
     Backbone.Collection.prototype.add.call(this, object, options) 
    } 
}, 

Tener mi aplicación de vuelta un código de estado de no éxito también funcionaría, ya que impide que se ejecuten las devoluciones de llamadas exitosas. Pero no me gustó la idea de devolver un error 400 solo porque el envío no era válido. Eso es algo que nunca he tenido que hacer en aplicaciones que no sean Backbone.js. ("Invertebrados"?)

Ninguna de las descripciones para los códigos de estado 4XX parecían realmente coincidían con el concepto de validación fallida. 400 y 403 se acercan, pero aún salen como si fueran para otros usos. Por otro lado, al usuario realmente no le importa qué código de estado devuelve; bien podría ser un 404.

Es realmente una cuestión de si desea escribir más código del lado del servidor o del lado del cliente. Mi aplicación más o menos ignora el resultado de la validación y devuelve el registro serializado a JSON, ya sea que se haya guardado o no, así que elegí trabajar desde ese ángulo.

+1

El código de estado correcto para devolver es 422 - Entidad no procesable. – mrt

0

Hablaré de usar jQuery como su biblioteca js subyacente (aunque supongo que zepto funciona de la misma manera). Las rutas backbone sincronizan eventos como model.save() collection.fetch(), etc ... a través de Backbone.sync(). Esta función delega en $ .ajax() para hacer la llamada ajax real. Por lo tanto, cualquier función de error que haya especificado al crear su objeto se usará MIENTRAS EL encabezado de la respuesta indique un error, como un encabezado 4XX.

A menudo verá que se realiza el manejo de errores en la función de éxito, porque la devolución en realidad no significa un error para jquery (cuando el encabezado de respuesta es 2XX).

7

servidor de validación espina dorsal lateral:

lado del servidor

devuelven errores gama

lado del cliente

Pass "de espera: true" como opción al llamar model.save:

modelVar.save(data,{ // here be options 
    wait: true, 
    success: this.processRequest, 
    error: this.processErrors 
}); 

actualización de la función de validación del modelo para comprobar la matriz errores:

validate: function(attrs) { 
    this.errors = []; 
    if (attrs.errors && attrs.errors.length > 0) { 
     for (var key in attrs.errors) { 
      this.errors.push(attrs.errors[key].errorMessage); 
     } 
    } 
    return _.any(this.errors) ? this.errors : null; 
} 

Resultado

La respuesta de error se ejecutará y el modelo no se "cambio" si el servidor Retruns [errores].

ACTUALIZACIÓN:

partir de la versión 0.9.10 esto ya no va a funcionar. Debes usar el evento "no válido" o utilizar el nuevo options argumento de la función model.validate(attributes, options): if (typeof(options.error === 'function')) options.error();

0

que normalmente devuelven un error HTTP desde el servidor junto con una descripción JSON error, algo como esto:

var xhr = myModel.save(); 
// On error show an alert 
xhr.fail(function() { 
    try { 
    // Assuming you are returning json error response like ["Error desc 01","Error desc 02"] 
    errors = JSON.parse(xhr.responseText); 
    alert(errors.join("\n")); 
    } catch(e) { 
    // Unknown error cause 
    alert("The server failed to respond, please try again later."); 
    } 
}); 
Cuestiones relacionadas