CouchDB:bulk_docs返回错误的状态代码

时间:2015-05-31 02:20:27

标签: couchdb pouchdb couchdb-futon

我正在努力将PouchDB数据库(使用Angular)与CouchDB数据库同步。

当复制正在进行时,代码正在发出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)。

是否有配置选项来更改此状态代码?

Fore reference,我的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"});
    }
}

1 个答案:

答案 0 :(得分:1)

417:expectation failed状态代码仅在all_or_nothing参数设置为true时有效。默认情况下,此参数为false。

couchdb中的默认批量更新事务模式是non atomic,它保证只保存部分文档。如果未保存文档,则api将返回一个错误对象,就像您获得的实际成功保存的文档列表一样。所以201似乎是正确的回应。

然后,您必须完成响应以查找哪些文档失败并手动更新它们。

如果是all_or_nothing模式,则只有在所有文档都已更新后才会返回成功。

同步时,您还可以使用具有批量更新所没有的许多其他功能的_replicate端点。