2011-05-20 59 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."); 
    } 
});