回答
或者可能是我应该使用http状态。目前我选择了403状态来表示服务器端的验证错误。有关状态的更多信息可以在这里找到:http://restpatterns.org/HTTP_Status_Codes
Backbone.js通过任何你有的基础库来路由它的ajax调用; JQuery或Zepto。所以基本上,这个图书馆决定什么是成功,什么是错误。
听起来你的服务器可能会返回一个403状态码,但这被解释为成功返回。因此,您的成功回调正在被调用。对于它的价值,403状态码对于返回错误似乎很奇怪,除非这些错误是与授权相关的。
这是你在找什么?
在我的客户端代码中,我检查是否存在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的记录,无论它是否已保存,所以我选择从这个角度开展工作。
要返回的正确状态码是422 - 不可处理的实体。 – mrt 2015-07-29 13:31:48
我会说使用jQuery作为您的基础js库(尽管我认为zepto以同样的方式工作)。 Backbone通过Backbone.sync()路由异步事件,如model.save()collection.fetch()等。这个函数委托给$ .ajax()来做实际的ajax调用。因此,无论您在创建对象时指定的错误函数都将被使用为“长”,因为响应标题表示错误,如4XX标题。
通常你会在成功函数中看到错误处理,因为返回实际上并不表示jQuery的错误(当响应头是2XX时)。
服务器端验证骨干:
服务器端
返回错误阵列
客户端
通 “等:真” 作为选项调用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();
我通常从服务器以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.");
}
});
- 1. datatables.net:服务器端处理的错误处理
- 2. 如何使用ajax.beginform处理MVC3中的服务器端错误
- 3. 在Post/Redirect/Get模式中如何处理服务器端错误?
- 4. Flotr&服务器端处理
- 5. 处理JS服务器端
- 6. 在浏览器中捕获服务器端ajax处理错误
- 7. Web套接字服务器端处理模型
- 8. Angular:处理服务器错误
- 9. 如何调试服务器端错误?
- 10. jquery Chunked Fileupload:处理服务器端错误
- 11. WCF:服务器端错误处理。最佳做法
- 12. 在grpc java/node上处理客户端和服务器错误
- 13. Android服务错误处理
- 14. 错误WCF服务处理
- 15. 如何处理Web服务和数据模型/控制器
- 16. 在.net MVC3中如何处理JqGrid中的服务器端错误?
- 17. 服务器端错误
- 18. 如何有效地处理WCF服务与错误处理
- 19. 服务人员如何处理全局错误处理?
- 20. 客户端处理vs服务器端处理,速度快吗?
- 21. 在服务器端禁用aspxgridviews,如何在客户端处理?
- 22. 如何处理流量中的服务器/请求错误?
- 23. 如何使用Android WebView处理“内部服务器错误”?
- 24. 如何在服务器级别定义错误处理逻辑
- 25. 如何处理数据库服务器错误?
- 26. 如何更改内部服务器错误的处理?
- 27. 服务总线1.0的Windows服务器交易/错误处理
- 28. 如何处理服务器端模拟的大型数据集 - >客户端浏览器
- 29. DataTables服务器端链接处理
- 30. jQuery DataTables 1.10服务器端处理列
这不应该是400(坏请求)而不是403(禁止)?当用户试图访问他们没有权限访问的资源时,我通常会看到403。 – 2012-12-10 21:51:04
我认为这应该是422(Unprocessable Entity);由于提交的数据无效,因此无法处理。 – sockmonk 2015-01-20 22:10:59