我正在使用couchrest_model与ruby中的CouchDB进行交互。我在数据库中有一堆文档,每个文档都添加了一个“updated_by”键,我希望保留有关进行更改的用户的信息。
这是正确的做事方式吗?
如果这是正确的方法,我应该如何使用couchrest_model以便我可以请求用户数据以及我的主数据库?
谢谢!
答案 0 :(得分:1)
唯一的方法是强制updated_by
字段等于userCtx.name
值validate_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
值不同的文档。