2016-01-29 104 views
23

我想使用Google Chrome的IndexedDB在客戶端持久保存數據。如何訪問Google Chrome的IndexedDB/LevelDB文件?

想法是在以後通過Node.JS訪問chrome外部的IndexedDB。 背景是在本地跟蹤使用行爲並將收集的數據存儲在客戶端上供以後分析而不需要服務器後端的想法。

從我的理解,indexedDB是作爲LevelDB實現的。但是,我無法用LevelUp/LevelDownleveldb-json之類的任何工具/庫打開levelDB。

我總是收到此錯誤信息:

leveldb-dump-to-json --file test.json --db https_www.reddit.com_0.indexeddb.leveldb 

events.js:141 
    throw er; // Unhandled 'error' event 
     ^ OpenError: Invalid argument: idb_cmp1 does not match existing comparator : leveldb.BytewiseComparator 
     at /usr/local/lib/node_modules/leveldb- json/node_modules/levelup/lib/levelup.js:114:34 Christians-Air:IndexedDB 

任何人可以請幫助?看起來好像Chrome的實現在某種程度上是特殊/不同的。

+0

我最終在Chrome中使用localstorage,它使用了一個常規的SQLite數據庫,這很容易處理。 – Chris

+0

另一種選擇是使用服務工作人員,並在瀏覽器中進行後續處理。 – kichik

回答

23

leveldb中的鍵是任意的二進制序列。客戶端執行comparators來定義鍵之間的順序。 leveldb的default comparator相當於strncmp。 Chrome針對索引數據庫存儲的比較器更加複雜。如果嘗試使用帶有不同比較器的leveldb實例,那麼它將以看似隨機的順序觀察密鑰,插入將不可預知或導致訛誤 - 狗和貓共同生活,羣衆歇斯底里。所以leveldb可以讓你命名比較器(保存到數據庫)來幫助檢測和避免這種錯誤,這就是你所看到的。 Chrome's code names its comparator for Indexed DB「idb_cmp1」。

要檢查chrome之外的Chrome索引DB leveldb實例,您需要實現兼容的比較器。該代碼位於Chrome的內容/瀏覽器/ indexed_db/indexed_db_backing_store.cc的實現中 - 請注意,不能保證這在各個版本中都是固定的。 (當然,除了向後兼容性)

+0

nodejs環境中的IndexedDB將會非常棒! –

+0

感謝Joshua對此事的詳細描述!對於我想要達到的目標,這對於我重新實現所需的比較器來說有點太費勁了。但是,感謝您提供一個有根據的見解! – Chris

相關問題