2014-05-03 155 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