2016-12-25 8 views
1

매우 가끔씩 내 모바일 앱 (Ionic 1)에서 데이터 손상이 발생합니다.PouchDB : 실시간 복제를 수행하는 동안 파손 된 데이터를 삭제합니까?

이 앱은 원격 CouchDB 서버에 로그인하는 사용자와 함께 작동합니다. 각 사용자는 서버에 자체 DB를 가지고 있습니다. 앱에는 한 번에 하나의 세션 만 있지만 사용자 A가 앱을 사용하고 로그 아웃 한 다음 사용자 B가 로그인하여 앱을 사용하는 경우가 있습니다.

로컬에서는 로그인 할 때 생성 된 다음 사용자의 원격 couchDB와 실시간으로 동기화 된 다음 로그 아웃 할 때 파괴되는 고유 한 PouchDB가 있습니다.

문제점 : 재현 할 수없는 매우 무작위 적이거나 드문 경우가 아니지만 사용자 A의 일부 데이터가 사용자 B의 데이터에 나타납니다! 그리고 더 이상, 사용자 A의 일부 데이터가 파기됩니다 (아마도 B로 전송, 확실하지 않음).

그래서, (: 원격으로 로컬 및 원격 지역에 두 가지의 옵션 { live: true, retry:true, continuous:true }PouchDB.replicate을) 내가 PouchDB.destroy 호출하면 실시간 동기화가 실행되는 동안 발생하는 궁금 해서요. destroy 복제 작업을 완전히 중단시키는 작업을하고 있습니까? 그렇지 않다면 일부 데이터가 이전 로컬 A 데이터베이스에서 새 로컬 B 데이터베이스로 이동되었다는 것을 설명 할 수 있습니다. (PouchDB 소스 코드를 찾아 보았으나 잃어 버렸습니다. Replication.cancelonDestroy에서 호출됨을 알 수있었습니다. 방법,하지만 내 사건에 대한 권리를 처리하는 확실하지).

많은 도움을 주셔서 감사합니다.

+1

사용자가 로그 아웃하면 어떻게됩니까? 복제를 취소합니까? – Phonolog

+0

아니요. 나는 destroy()를 호출한다. (확실하게 복제에서 호출 된 'cancel'을 만든다.) – 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