跟踪哪个用户编辑了CouchDB文档

时间:2012-12-21 12:21:04

标签: ruby couchdb couchrest

我正在使用couchrest_model与ruby中的CouchDB进行交互。我在数据库中有一堆文档,每个文档都添加了一个“updated_by”键,我希望保留有关进行更改的用户的信息。

这是正确的做事方式吗?

如果这是正确的方法,我应该如何使用couchrest_model以便我可以请求用户数据以及我的主数据库?

谢谢!

1 个答案:

答案 0 :(得分:1)

唯一的方法是强制updated_by字段等于userCtx.namevalidate_doc_update function

function(newdoc, olddoc, userctx, secobj){
   if (newdoc.updated_by != userctx.name)
       throw({"forbidden": "`updated_by` field should match real updater user name"})
}

此功能将控制所有文档(设计除外)的内容,要求它们以您期望的方式获取数据。

此时您可能会停止,但他有一个缺陷:您的所有客户都必须手动设置此字段。这很尴尬,不让他们“放松”。为了解决这个问题,CouchDB提供了update functions,允许在服务器端设置业务逻辑的某些部分,从客户端实现中删除这些知识。所以你的更新功能可能如下:

function(doc, req){
   if (!doc){ // new doc
     doc = JSON.parse(req.body);
   }
   doc.updated_by = req.userCtx.name;
   return [doc, {"json": {"status": "ok"}}
}

他让你以正确的方式设置updated_by字段。此外,您可以通过添加越来越多的元字段(例如userCtx.peer保留客户端IP地址)来扩展此功能,如果您的客户端将使用它,则不需要对元数据更改进行任何更新。

但请注意,您需要为服务用户提供一些例外,否则您将在CouchDB节点之间获得损坏的复制,因为验证功能将拒绝所有与用户名updated_by值不同的文档。