PouchDB损坏检测

3
我正在开发一个具备离线功能的Web应用。我使用了webcachepouchDB的组合来实现这一目标。
目前,我正在测试针对数据库损坏的恢复机制。我的前提是,由于pouchDB在客户端运行,所以任何人都可以意外或故意破坏数据库。此外,在出现错误或类似情况时,数据库可能会损坏。如果数据库损坏了,除非通过Web应用程序检测到并清理,否则它将永远无法正常工作。
测试非常简单: - 创建PouchDB:

    var dbOptions = {
       auto_compaction : false,
       cache : false
    };
    var db = new PouchDB('myDB',dbOptions);

  • 使用开发者工具删除部分数据库。
  • 在加载应用程序时,它尝试读取所有文档:
    db.allDocs({include_docs : true}, function(_err,_response){
        (某些代码)
    }

此时会抛出"Uncaught TypeError: Cannot set property '_rev' of undefined "。我尝试捕获异常并使用pouchDB提供的promise,但都没有起作用。
你们有没有遇到过类似的问题?你们是如何解决的?
编辑: 当PouchDB返回500内部错误时,应用程序应该如何恢复?我尝试销毁数据库

    db.destroy(function(err,info){console.log(err||info);}

但它不起作用。它也返回500内部错误。
2个回答

3
确实听起来像是你的数据库损坏了。很抱歉;我们试图编写防弹代码,但由于我们正在使用WebSQL/IndexedDB API,因此总有可能出现接口问题、浏览器崩溃、电脑被闪电击中等情况。
500错误表示PouchDB内部出错,因此你无法从中恢复。最好的保护方法可能就是与CouchDB服务器设置连续同步(这也是PouchDB的重点之一)。CouchDB是一个完整的数据库实现,非常健壮——因为它使用追加式数据库文件,所以您的数据库永远不会损坏。因此,如果您使用连续同步,您可以随时删除PouchDB数据库并从CouchDB中恢复。
话虽如此,如果您能告诉我们您正在运行的PouchDB版本、在哪个浏览器上看到的,或者甚至是一个可重现代码片段,那将非常有帮助。如果您正在使用Firefox,则还可以按照这里的说明找到配置文件夹,然后向我们发送storage/persistent//idb文件夹的内容。谢谢!

其实我是故意破坏数据库来测试如何从中恢复的。我只是不相信人们/浏览器/有缺陷的代码可能对数据库做什么。另一方面,当我与couchDB实例(couchappy)连接时运行db.destroy(),我可以获得损坏的数据库(Uncaught NotFoundError: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.)。我认为这可能会发生在正在进行同步的同时,但我还没有证明它。至少在Pouch版本2.1.0和2.2.0中。 - tup
我会进行更多的测试并尝试获取关于这个问题的事实。 - tup
如果您有更多信息,请在 https://github.com/pouchdb/pouchdb/issues 提交问题。 - nlawson
我还在PouchDB的Google Group中提出了这个问题,Dale也在GitHub上开了一个bug(https://github.com/pouchdb/pouchdb/issues/2181)。 - tup

0

在向我的 RxDB 数据库添加新模式时,我遇到了这个错误。结果发现我将主键和错误的属性名称包含在加密字段中。我删除了主键并放置了正确的名称,之后它就正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接