CouchDB:bulk_docs 返回不正确的状态代码
CouchDB: bulk_docs returning incorrect status code
我正在努力将 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"});
}
}
417:expectation failed
状态代码仅在 all_or_nothing
参数设置为 true 时有效。默认情况下,此参数为 false。
couchdb 默认的批量更新事务模式是non atomic,保证只保存部分文档。如果文档未保存,api returns 一个错误对象,就像您得到的文档列表一样,实际上已成功保存。所以 201
似乎是正确的回应。
然后您必须遍历响应以查找失败的文档并手动更新它们。
在 all_or_nothing
模式的情况下,只有在所有文档都已更新后才会返回成功。
同步时,您还可以使用 _replicate 端点,它具有批量更新所没有的许多其他功能。
我正在努力将 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"});
}
}
417:expectation failed
状态代码仅在 all_or_nothing
参数设置为 true 时有效。默认情况下,此参数为 false。
couchdb 默认的批量更新事务模式是non atomic,保证只保存部分文档。如果文档未保存,api returns 一个错误对象,就像您得到的文档列表一样,实际上已成功保存。所以 201
似乎是正确的回应。
然后您必须遍历响应以查找失败的文档并手动更新它们。
在 all_or_nothing
模式的情况下,只有在所有文档都已更新后才会返回成功。
同步时,您还可以使用 _replicate 端点,它具有批量更新所没有的许多其他功能。