【问题标题】:PouchDB corruption detectionPouchDB 损坏检测
【发布时间】:2014-05-03 10:32:26
【问题描述】:

我正在构建一个具有离线功能的 web 应用程序。我正在使用webcachepouchDB 的组合来实现它。

目前我正在测试针对数据库损坏的恢复机制。我的前提是,由于 pouchDB 是在客户端运行的,它暴露给任何错误或故意破坏数据库的人。 也许如果出现错误或类似情况,数据库可能会损坏。然后,如果 DB 损坏,除非它被 webapp 检测到并清理,否则它将永远无法正常工作。

测试很简单: - 创建 PouchDB:

var dbOptions = { 自动压缩:假, 缓存:假 }; var db = new PouchDB('myDB',dbOptions);
  • 使用开发者工具删除部分数据库。
  • 在加载应用程序时,它会尝试读取所有文档:
db.allDocs({include_docs : true}, function(_err,_response){ (此处有特定代码) }

此时"Uncaught TypeError: Cannot set property '_rev' of undefined " 被抛出。我试图捕捉异常并使用 pouchDB 提供的承诺,但没有一个奏效。

各位小伙伴有遇到过类似的问题吗?你是怎么解决的?

编辑: 当 PouchDB 返回 500 Internal error 时,应用程序应该如何从中恢复?我试图破坏数据库

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

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

【问题讨论】:

    标签: corruption pouchdb


    【解决方案1】:

    听起来您的数据库确实已损坏。对于那个很抱歉;我们尝试编写防弹代码,但由于我们使用的是 WebSQL/IndexedDB API,因此该接口总是有可能出现问题,浏览器崩溃,计算机被雷击等等。

    500 错误表示内部 PouchDB 错误,因此您不应该从中恢复。可能防止此类损坏的最佳方法就是设置与 CouchDB 服务器的持续同步(无论如何都是 PouchDB 的重点)。 CouchDB 是一个从上到下实现的完整数据库,并且非常健壮——因为它使用仅附加的数据库文件,所以您的数据库永远不会损坏。所以如果你使用持续同步,你总是可以删除 PouchDB 数据库并从 CouchDB 中恢复。

    话虽如此,如果您可以让我们知道您正在运行哪个版本的 PouchDB,您在哪个浏览器上看到了这个,或者甚至是要重现的代码 sn-p,那将非常有帮助。如果您使用的是 Firefox,您还可以按照说明 here 找到 Profile 文件夹,然后将 storage/persistent/<my_site>/idb 文件夹的内容发送给我们,将 IDB 的存储文件本身发送给我们。谢谢!

    【讨论】:

    • 实际上我是故意破坏数据库以测试如何从中恢复。我只是不相信人们/浏览器/错误代码可能对数据库做什么。另一方面,我可以通过运行 db.destroy() 在连接到 couchDB 实例(couchappy )。我认为如果同时发生正在进行的同步,这可能会发生,但我还没有得到证明。至少在 Pouch 版本 2.1.0 和 2.2.0 中。
    • 我将进行更多测试并尝试了解有关此问题的事实。
    • 好的,如果您获得更多信息,请在github.com/pouchdb/pouchdb/issues 提出问题。
    • 我还在谷歌组中打开了 PouchDB 的问题,Dale 打开了一个关于它的错误 (github.com/pouchdb/pouchdb/issues/2181)。
    【解决方案2】:

    向我的 RxDB 数据库添加新架构时出现此错误。原来我在加密字段中包含了主键和错误的属性名称。我删除了主键并输入了正确的名称,然后它就可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2012-04-13
      • 2011-07-24
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 2020-01-15
      • 2013-11-01
      • 2020-08-02
      相关资源
      最近更新 更多