3

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

目前我正在测试针对数据库损坏的恢复机制。我的前提是,由于 pouchDB 是在客户端运行的,它暴露给任何错误或故意破坏数据库的人。也可能在错误或类似情况下,数据库可能会损坏。然后,如果数据库损坏,除非它被 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 内部错误时,应用程序应该如何从中恢复?我试图破坏数据库

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

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

4

2 回答 2

3

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

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

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

于 2014-05-05T17:25:34.673 回答
0

在向我的 RxDB 数据库添加新模式时出现此错误。原来我在加密字段中包含了主键和错误的属性名称。我删除了主键并输入了正确的名称,之后它运行良好。

于 2021-03-29T13:38:34.237 回答