2016-12-25 3 views
1

モバイルアプリケーション(Ionic 1)でデータが破損していることがあります。PouchDB:ライブレプリケーション中に破棄されますか?

このアプリは、リモートのCouchDBサーバーにログオンしているユーザーと連携して動作しています。各ユーザーはサーバーに独自のdbを持っています。アプリ内では一度に1セッションしかありませんが、ユーザAがアプリを使用してログアウトした後、ユーザBがログインしてアプリを使用することがあります。

ローカルでは、このアプリケーションにはログイン時に作成された1つのユニークなPouchDBがあり、その後、ユーザーのリモートcouchDBとライブ同期してログアウトすると破棄されます。

問題:再現できない非常にランダムで稀なケースでは、ユーザーAのデータがユーザーBのデータに表示されます。ユーザーAの一部のデータが破棄されます(おそらくBに転送される可能性があります)。

PouchDB.destroyライブ同期が実行されているときに(PouchDB.replicateとオプション{ live: true, retry:true, continuous:true }の両方の方法でローカル:ローカルとリモートの両方のオプションで{ live: true, retry:true, continuous:true })呼び出すとどうなりますかと思いました。 destroyは複製を完全に停止するために何かをしていますか?そうでない場合は、古いローカルのAデータベースから新しいローカルのBデータベースにデータが転送されている可能性があります(PouchDBのソースコードを参照しようとしましたが、失われてしまいました)。Replication.cancelonDestroyメソッドが、私の場合は右のものを処理するかわからない)。

何か助けてくれてありがとう!

+1

ユーザーがログアウトするとどうなりますか?レプリケーションを 'キャンセル 'しますか? – Phonolog

+0

いいえ、私はしません。私はdestroy()を呼び出します(明らかにレプリケーションで呼び出された「キャンセル」を行いますが、わかりません) – bfredo123

+0

私はレプリケーションを最初にキャンセルし、後でdbを '破棄 'しようとします。最悪のケースです:暗黙のうちに 'cancel'をもう呼び出さないと、あなたのコードは少しだけ読みやすくなりました。最良の場合:あなたの問題は解決されます;) – Phonolog

答えて

3

レプリケーション中にデータベースを破壊する最も安全な方法は、最初にcancel()を呼び出してからcompleteイベントを待つことです。例えば:

var sync = db.sync(otherDB, {live: true, retry: true}); 
 
sync.on('complete', function() { 
 
    db.destroy().then(/* ... */); 
 
}); 
 
/* ... */ 
 
sync.cancel(); // will trigger a 'complete'

役に立てば幸い!

+0

多くのおかげで、それを試してみましょう!そして、それをやっていないと(つまり、キャンセル+呼び出しが完了するのを待って)データの破損の問題が説明されると思いますか? – bfredo123

+0

私はいくつかのテストを行いました。しかし、問題はランダムなので、100%確実にするのは難しいです。私は最も重要なことは、ローカルDBを破壊する前に、同期が完了するための方法だと思う。また、エンドポイントに ":3000"ポート参照が含まれていないため、ログアウトが失敗するというスーパーログ設定にも問題がありました(gitgubの#2号のsuperloginを参照してください)。これがどのように影響を与えるかわからない... – bfredo123

関連する問題