Nic*_*ins 3 recursion couchdb infinite
我想编写一个后台程序来监视 CouchDB 的 _changes feed,并可能更新文档。问题是更新导致了另一个 _change,我得到了一个无限循环!避免这种情况的最佳方法是什么?
例如,以下是具体场景:我有一个 CouchApp,用户通过浏览器修改文档。我还有一个 python 程序,它创建文档的 PDF 版本,然后将其作为附件附加到文档本身。我的问题是,执行 PUT 附件上传 PDF 也会触发文档更改。我必须能够判断更改是否是由 PDF 上传引起的。看起来应该很容易,但我想不出一个简单的方法来做到这一点。我宁愿让 PDF 生成器程序保持“无状态”,在数据库本身中保留任何所需的状态。
现在,如果我要求更改文档的用户在文档上设置某种标志以表明需要对其进行处理,则可以轻松完成此操作。诀窍在于如何在不需要这样做的情况下做到这一点。
我得出的结论是“_changes”监听器永远不应该修改它监听的文档。就我而言,我决定将 PDF 文件附加到一个单独的文档,位于 couchdb 内的单独“数据库”中,但使用相同的“_id”以使其易于关联。这样我就不会在我正在收听的相同文档上触发“_change”。我无法满足要求每个更改文档的客户以某种方式将其“标记”为需要处理的需要(通过删除现有附件,或以其他方式设置一些“脏”标记)。经过深思熟虑,我认为这对我来说是一条经验法则:在收到该文档的“_change”通知后,您不得修改该文档。还有其他人得出同样的结论吗?
使用过滤函数并通过文档结构更改或为更改的文档设置附加标志来过滤掉第二个更改 \xe2\x80\x93 :
\n\nfunction(doc, req)\n{\n if(!doc.hasStructuralChange) { //fix this\n return true;\n }\n return false;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n或者
\n\nfunction(doc, req)\n{\n if(!doc.changed) { //set doc.changed during first update\n return true;\n }\n return false;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n编辑:您可以通过以下方式检查附件if (doc._attachments)