2014-05-03 113 views
2

我正在构建一个具有脱机功能的web应用程序。我正在使用webcachepouchDB的组合来实现它。PouchDB损坏检测

目前我正在测试数据库损坏的恢复机制。我的前提是,由于pouchDB在客户端运行,因此它暴露给任何错误或故意会损坏数据库的人。也可能是如果出现错误或类似情况,数据库可能会损坏。然后,如果数据库被损坏,除非它被web应用程序检测到并清理干净,否则这将无法正常工作。

测试很简单: - 创建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提供的承诺,但没有一个能够工作。

你们有没有人有类似的问题?你是如何解决它的?

编辑: 当PouchDB返回500内部错误,应用程序应该如何从它恢复?我试图破坏数据库

 

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

,但它不工作。它也返回500内部错误。

回答

1

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

500错误指示一个内部的PouchDB错误,所以你不应该从它们中恢复。也许防止这种腐败的最好方法就是建立与CouchDB服务器的连续同步(无论如何,都是PouchDB的要点)。 CouchDB是从上到下实现的完整数据库,并且由于它使用仅附加数据库文件,所以其数据库永远不会损坏,所以它是非常强大的–。所以如果你使用连续同步,你总是可以删除PouchDB数据库并从CouchDB中恢复。这就是说,如果你可以让我们知道你正在运行哪个版本的PouchDB,你看到了哪个浏览器,甚至是一个代码片段来重现,那真的很有用。如果您使用的是Firefox,您也可以按照here的指示找到Profile文件夹,然后发送storage/persistent/<my_site>/idb文件夹的内容,将它们自己的存储文件发送给我们。谢谢!

+0

其实我试图破坏数据库来测试如何从中恢复。我只是不相信人们/浏览器/ buggy代码可能会对数据库做什么。另一方面,我可以通过在与couchDB实例连接时运行db.destroy()来获取损坏的数据库(Uncaught NotFoundError:未能在'IDBTransaction'上执行'objectStore':找不到指定的对象存储区) (couchappy)。我认为如果正在进行的同步在同一时间发生,这可能会发生,但我还没有证明它。 至少在囊袋版本2.1.0和2.2.0。 – tup

+0

我将执行更多测试并尝试获取有关此问题的事实。 – tup

+0

好的,如果你有更多的信息,请在https://github.com/pouchdb/pouchdb/issues上提出问题。 – nlawson