回答
或者可能是我應該使用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. 如何在node.js服務器端重現Backbonejs模型和集合
- 2. asp.net ajax服務器端錯誤處理
- 3. datatables.net:服務器端處理的錯誤處理
- 4. 如何正確處理服務器端錯誤?
- 5. 如何使用ajax.beginform處理MVC3中的服務器端錯誤
- 6. 在Post/Redirect/Get模式中如何處理服務器端錯誤?
- 7. 處理JS服務器端
- 8. Flotr&服務器端處理
- 9. Datatables服務器端處理
- 10. 在瀏覽器中捕獲服務器端ajax處理錯誤
- 11. Web套接字服務器端處理模型
- 12. PowerShell Sql服務器SMO錯誤處理
- 13. Angular:處理服務器錯誤
- 14. 燼數據處理服務器錯誤
- 15. Teamcenter |服務器|代碼錯誤處理
- 16. ZeroMQ REQ/REP服務器錯誤處理
- 17. 批處理sql服務器錯誤
- 18. 在asp.net中處理服務器錯誤
- 19. 如何調試服務器端錯誤?
- 20. 獲取服務器端XML處理時的錯誤
- 21. 在grpc java/node上處理客戶端和服務器錯誤
- 22. jqgrid服務器端錯誤消息/驗證處理
- 23. jquery Chunked Fileupload:處理服務器端錯誤
- 24. WCF:服務器端錯誤處理。最佳做法
- 25. TIdFtpClient - 處理服務器端的特定錯誤
- 26. backbonejs collection.fetch錯誤處理程序
- 27. 錯誤WCF服務處理
- 28. Android服務錯誤處理
- 29. 如何使Ember控制器處理服務器驗證錯誤?
- 30. 如何處理Web服務和數據模型/控制器
這不應該是400(壞請求)而不是403(禁止)?當用戶試圖訪問他們沒有權限訪問的資源時,我通常會看到403。 – 2012-12-10 21:51:04
我認爲這應該是422(Unprocessable Entity);由於提交的數據無效,因此無法處理。 – sockmonk 2015-01-20 22:10:59