CouchDB: bulk_docs返回错误的状态码



我正在同步一个PouchDB数据库(与Angular)与一个CouchDB数据库。

当复制正在进行时,代码发出POST请求对http://127.0.0.1:5984/testdb/_bulk_docs进行批量更新。

我在数据库上有一个验证规则来拒绝未经授权的写,它产生一个禁止错误。因此,服务器使用JSON响应[{"id":"0951db944e729c981ad3964c22002d55","rev":"8-ccdcb52743cae43c5870113f09f2e25a","error":"forbidden","reason":"Not Authorized"}]

进行响应。

根据文档(页面末尾),上述响应应该生成一个417 Expectation Failed状态码。但是,它目前生成一个201 Created状态码。

由于错误的响应代码,客户端(PouchDB)显示为所有记录已同步,但更新未写入服务器(CouchDB)。

是否有一个配置选项来改变这个状态码?

在参考之前,我的validate_doc_update函数如下:

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"});
    }
}

只有当all_or_nothing参数设置为true时,417:expectation failed状态码才有效。缺省情况下,该参数为false。

couchdb中默认的批量更新事务模式是非原子的,它保证只保存一些文档。如果文档没有保存,api将返回一个错误对象,就像您看到的那样,同时返回实际上已成功保存的文档列表。所以201似乎是正确的反应。

然后您必须遍历响应以查找失败的文档并手动更新它们。

all_or_nothing模式的情况下,只有当所有文档都已更新时才会返回成功。

在同步时,您还可以使用_replication端点,它具有大量更新所不具备的许多其他特性。

相关内容

最新更新