2011-05-20 79 views

回答

3

或者可能是我应该使用http状态。目前我选择了403状态来表示服务器端的验证错误。有关状态的更多信息可以在这里找到:http://restpatterns.org/HTTP_Status_Codes

+10

这不应该是400(坏请求)而不是403(禁止)?当用户试图访问他们没有权限访问的资源时,我通常会看到403。 – 2012-12-10 21:51:04

+1

我认为这应该是422(Unprocessable Entity);由于提交的数据无效,因此无法处理。 – sockmonk 2015-01-20 22:10:59

0

Backbone.js通过任何你有的基础库来路由它的ajax调用; JQuery或Zepto。所以基本上,这个图书馆决定什么是成功,什么是错误。

听起来你的服务器可能会返回一个403状态码,但这被解释为成功返回。因此,您的成功回调正在被调用。对于它的价值,403状态码对于返回错误似乎很奇怪,除非这些错误是与授权相关的。

这是你在找什么?

7

在我的客户端代码中,我检查是否存在errors属性,并在必要时作出反应。

例如,我使用了Collection.create函数,如果请求成功,它会调用Collection的add函数。所以,我重覆了我的Collection的add函数,以防止模型被添加,如果它具有'错误'属性,并且它不调用“超级”方法。

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

让我的应用程序返回一个非成功状态代码也可以,因为它阻止了成功的回调被运行。但是,我不喜欢因为提交无效而返回400错误的想法。这是我在非Backbone.js应用程序中从来不需要做的事情。 (“无脊椎动物”?)

4XX状态代码的描述似乎没有真的匹配失败验证的概念。 400和403接近,但仍然脱落,好像它们打算用于其他用途。另一方面,用户真的不在乎你返回的状态码;可能是404.

这实际上是你想写更多的代码服务器端还是客户端的问题。我的应用程序或多或少地忽略了验证的结果,并返回序列化为JSON的记录,无论它是否已保存,所以我选择从这个角度开展工作。

+1

要返回的正确状态码是422 - 不可处理的实体。 – mrt 2015-07-29 13:31:48

0

我会说使用jQuery作为您的基础js库(尽管我认为zepto以同样的方式工作)。 Backbone通过Backbone.sync()路由异步事件,如model.save()collection.fetch()等。这个函数委托给$ .ajax()来做实际的ajax调用。因此,无论您在创建对象时指定的错误函数都将被使用为“长”,因为响应标题表示错误,如4XX标题。

通常你会在成功函数中看到错误处理,因为返回实际上并不表示jQuery的错误(当响应头是2XX时)。

7

服务器端验证骨干:

服务器端

返回错误阵列

客户端

通 “等:真” 作为选项调用model.save时:

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

更新模型的验证功能来检查错误数组:

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

成果

错误回调将运行和模型不会在服务器retruns [错误]“变革”。

UPDATE:

截至0.9.10版本将不再工作。您应该使用“无效”事件,或使用新的options论点model.validate(attributes, options)功能:if (typeof(options.error === 'function')) options.error();

0

我通常从服务器以JSON错误描述一起返回的HTTP错误, 是这样的:

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