backbonejs模型如何处理服务器端错误?
当我发送带有错误数组的json时,我仍然会在响应参数内部使用errors数组获得成功回调。
答案 0 :(得分:7)
在我的客户端代码中,我检查是否存在errors属性并根据需要做出反应。
例如,我使用的是Collection.create函数,如果请求成功,它会调用Collection的add函数。所以,我覆盖了我的Collection的添加功能,以防止在有错误属性的情况下添加模型,如果它没有调用“超级”方法。
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 :(得分:7)
服务器端骨干验证:
服务器端
返回错误数组
客户端
调用model.save时,将“wait:true”作为选项:
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;
}
<强>结果强>
错误回调将运行,如果服务器重新发生[错误],模型将不会“更改”。
<强>更新强>
从版本0.9.10开始,这将不再有效。您应该使用“无效”事件或使用options
函数的新model.validate(attributes, options)
参数:if (typeof(options.error === 'function')) options.error();
答案 2 :(得分:3)
或者可能是我应该使用http状态。目前,我已选择403状态来指示服务器端的验证错误。有关状态的更多信息,请访问:http://restpatterns.org/HTTP_Status_Codes
答案 3 :(得分:0)
Backbone.js通过你所拥有的任何底层库路由它的ajax调用; JQuery或Zepto。所以基本上,这个库决定什么是成功,什么是错误。
听起来您的服务器可能正在返回403状态代码,但这被解释为成功返回。因此,您的成功回调正在被调用。对于它的价值,403状态代码对于返回错误似乎很奇怪,除非这些错误与授权相关。
这是你在找什么?
答案 4 :(得分:0)
我会说使用jQuery作为底层的js库(虽然我认为zepto的工作方式相同)。 Backbone通过Backbone.sync()路由异步事件,如model.save()collection.fetch()等。该函数委托$ .ajax()进行实际的ajax调用。因此,无论您在创建对象时指定的任何错误函数都将被使用,因为响应的标头表示错误,如4XX标头。
通常,您会在success函数中看到错误处理,因为返回实际上并不表示jquery发生错误(当响应头为2XX时)。
答案 5 :(得分:0)
我通常从服务器返回HTTP错误以及JSON错误描述, 像这样的东西:
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.");
}
});