【问题标题】:CouchDB: bulk_docs returning incorrect status codeCouchDB:bulk_docs 返回不正确的状态码
【发布时间】:2015-05-31 02:20:26
【问题描述】:

我正在将 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)。

是否有配置选项可以更改此状态码?

参考,我的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"});
    }
}

【问题讨论】:

    标签: couchdb pouchdb couchdb-futon


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 看来你是对的。我认为如果至少有 1 条记录无法同步,它会给出 417 错误。看来我必须手动处理身份验证错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多