2015-05-31 49 views
2

我正在同步一個PouchDB數據庫(使用Angular)和一個CouchDB數據庫。CouchDB:bulk_docs返回不正確的狀態代碼

複製正在進行時,代碼正在發出POST請求,以批量更新到http://127.0.0.1:5984/testdb/_bulk_docs

我有一個數據庫驗證規則拒絕未經授權的寫入,它會產生一個禁止的錯誤。因此,服務器響應JSON響應爲[{"id":"0951db944e729c981ad3964c22002d55","rev":"8-ccdcb52743cae43c5870113f09f2e25a","error":"forbidden","reason":"Not Authorized"}]

根據to the docs (at the end of the page),上述響應應生成417 Expectation Failed狀態碼。但是,它當前會生成一個201 Created狀態碼。

由於響應代碼不正確,客戶端(PouchDB)顯示所有記錄已同步,但更新未寫入服務器(CouchDB)。

是否有配置選項來更改此狀態碼?

預先參考,我的validate_doc_update功能如下。當all_or_nothing參數設置爲true

function(newDoc, oldDoc, userCtx){ 
    if (!userCtx) throw({forbidden: 'Need a user to update'}); 

    if((userCtx.roles.indexOf('_admin') == -1) && (userCtx.roles.indexOf('backend:manager') == -1)){ 
      throw({forbidden: "Not Authorized"}); 
    } 
} 

回答

1

417:expectation failed狀態代碼纔有效。默認情況下這個參數是false。

couchdb中默認的批量更新事務模式是non atomic,它保證只保存一些文檔。如果文檔沒有保存,則api會返回一個錯誤對象,就像您獲得的文檔列表實際上已成功保存一樣。所以201似乎是正確的迴應。

然後,您必須通過響應來查找哪些文檔失敗並手動更新它們。

但是,如果是all_or_nothing模式,只有在所有文件都更新後纔會返回成功。

在同步時,您還可以使用具有批量更新所沒有的許多其他功能的端點_replicate

+0

看起來你是對的。我認爲如果至少有一條記錄無法同步,會出現417錯誤。看起來我必須手動處理認證錯誤。 – shanecp