2016-12-25 15 views
1

У меня повреждение данных в мобильном приложении (Ionic 1), в очень редких случаях.PouchDB: уничтожает чистую, делая живую репликацию?

Приложение работает с пользователями, регистрирующимися на удаленном сервере CouchDB. Каждый пользователь имеет свой собственный db на сервере. В приложении есть только один сеанс за раз, но может случиться, что пользователь A использует приложение, выходит из системы, а затем пользователь B регистрируется для использования приложения.

Локально приложение имеет один уникальный PouchDB, который создается при входе в систему, а затем синхронизируется в реальном времени с удаленным couchDB пользователя, а затем уничтожается при выходе из системы.

Проблема: в очень случайных и непредсказуемых случаях, которые я не могу воспроизвести, некоторые данные пользователя A появляются в данных пользователя B! и более того, некоторые данные пользователя A уничтожаются (возможно, переданы B, но не уверены).

Итак, мне было интересно, что произойдет, если я вызову PouchDB.destroy, пока работает прямая синхронизация (PouchDB.replicate с опциями { live: true, retry:true, continuous:true } в обоих направлениях: локально для удаленных и удаленных локальных). destroy что-то делать, чтобы чисто остановить репликацию? Если нет, это может объяснить, что некоторые данные переносятся из старой локальной базы данных A в новую локальную базу данных B (я попытался просмотреть исходный код PouchDB, но потерялся в нем. Я мог просто увидеть, что Replication.cancel вызывается из его onDestroy метод, но не уверен, что он справится со всем, что подходит для моего случая).

Большое спасибо за помощь!

+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% уверенным, так как проблема случайна. Я думаю, что самое главное - синхронизировать синхронизацию, прежде чем уничтожить локальную БД. У меня также была проблема в моей конфигурации superlogin, где конечная точка не включала ссылку на порт «: 3000», что приводило к сбоям выхода из системы (см. Вопрос № 2 о суперлогине на gitgub). Не знаю, как это может повлиять ... – bfredo123