我正在构建一个具有离线功能的webapp。我正在使用webcache
和pouchDB
的组合来实现它。
目前我正在测试针对数据库损坏的恢复机制。我的前提是,由于pouchDB在客户端运行,因此任何错误或故意破坏数据库的人都会接触到它。此外可能如果出现错误或类似情况,DB可能会损坏。然后,如果数据库被破坏,除非被webapp检测到并清除,否则这将无法正常工作。
测试非常简单: - 创建PouchDB:
var dbOptions = { auto_compaction : false, cache : false }; var db = new PouchDB('myDB',dbOptions);
db.allDocs({include_docs : true}, function(_err,_response){ (certain code here) }
此时抛出"Uncaught TypeError: Cannot set property '_rev' of undefined "
。我试图通过pouchDB捕获异常并使用提供的promise,但没有一个能够正常工作。
你们中的任何人都有类似的问题吗?你是怎么解决的?
修改 当PouchDB返回500内部错误时,应用程序应该如何从中恢复?我试图销毁数据库
db.destroy(function(err,info){console.log(err||info);}
但它不起作用。它也会返回500内部错误。
答案 0 :(得分:1)
确实听起来你的数据库已损坏。对于那个很抱歉;我们尝试编写防弹代码,但由于我们正在使用WebSQL / IndexedDB API,因此在该界面上出现问题的可能性总是存在,浏览器崩溃,闪电击中计算机等等。 / p>
500错误表示内部PouchDB错误,因此您不应该从它们恢复。可能防止腐败的最佳方法就是与CouchDB服务器建立连续同步(无论如何都是PouchDB的一种点)。 CouchDB是一个从上到下实现的完整数据库,非常强大 - 因为它使用仅附加数据库文件,所以您的数据库永远不会被破坏。因此,如果使用连续同步,则可以始终删除PouchDB数据库并从CouchDB恢复。
话虽如此,如果您能告诉我们您正在运行哪个版本的PouchDB,您看到了哪个浏览器,甚至是重现的代码片段,那将非常有用。如果您正在使用Firefox,您还可以按照here的说明向我们发送IDB自身的存储文件,以查找“配置文件”文件夹,然后向我们发送storage/persistent/<my_site>/idb
文件夹的内容。谢谢!
答案 1 :(得分:0)
我在向 RxDB 数据库添加新架构时遇到此错误。结果是我将主键和错误的属性名称包含在加密字段中。我删除了主键并输入了专有名称,之后它工作正常。