Синхронизация Pouchdb не сохраняет данные на пульте сразу - PullRequest
0 голосов
/ 26 июня 2019

Я написал синхронизацию pouchdb (в приложении Angular) с удаленной базой данных, которая отправляет удаленные изменения в приложение.

Я понял, согласно документации PouchDb, что данные должны синхронизироваться PouchDb.sync между локальным IndexedDb и удаленным сервером. После этого его получит второй клиент.

Это код, который я использовал для синхронизации:

export const appDataDbSyncArgs: IDbSyncArguments = {
    localDbName: "app_data",
    remoteDbUrl: "http://localhost:4984/app_data",    
    syncOptions: {
        live: true,
        retry: true,
        since: 0,
        batch_size: 1,
        batches_limit: 1
    }
};


PouchDB.replicate(remoteDbUrl, localDbName)
        .on("active", () => {
            console.log("replication is active");
            const replicationStartedMessage = applyMessageType({}, replicationStarted);
            messenger.postMessage(replicationStartedMessage);
        })
        .on("complete", info => {
            console.log("%cReplication has been completed.", "color: lightgreen; font-size: 20px;");
            const replicationCompleteMessage = applyMessageType(info, replicationComplete);
            messenger.postMessage(replicationCompleteMessage);

            PouchDB.sync(localDbName, remoteDbUrl, syncOptions)
                .on("change", changeInfo => {
                    console.log("%cSync changes", "color: green; font-size: 20px;");
                    const changesInfoMessage = applyMessageType(changeInfo, syncChanges);
                    messenger.postMessage(changesInfoMessage);
                })
                .on("error", err => {
                    console.log("sync error", err);
                    const errorMessage = applyMessageType(err, syncError);
                    messenger.postMessage(errorMessage);

                })
                .on("paused", err => {
                    console.log("sync error (paused)", err);                

                })
                .on("active", () => {
                    console.log("sync active");

                })
                .on("denied", err => {
                    console.log("sync error (denied)", err);        

                })
                .on("complete", info => {
                    console.log("sync complete", info);                   

                });
        })
        .on("error", err => {
            console.log("replication error", err);
            const replicationErrorMessage = applyMessageType(err, replicationError);
            messenger.postMessage(replicationErrorMessage);
        });

И вот код, который я использовал для сохранения данных:

protected _addDocument<T> (id: string, document: PutDocument<{} & T>): Observable<Response> {
        document['_id'] = id;
        //document._rev = null;
        return fromPromise(this._db.put<T>(document))
            .pipe(
                take(1) 
            );
    }

// Where this._db = new PouchDB(localDbName);

Он сразу сохраняет данные в IndexedDb, но не сохраняет их в удаленной базе данных. Иногда данные поступают в удаленную БД через 5-10 минут и более. Иногда сразу. Но если данные поступают на удаленную базу данных или я меняю данные на удаленном сервере, pouchDb запускает событие «onChange», и второй клиент получает их в приложении.

Но мне нужно, чтобы данные, сохраненные в IndexedDb, были немедленно сохранены в удаленной базе данных.

1 Ответ

1 голос
/ 05 июля 2019

Это ожидаемое поведение. CouchDB и, как следствие, PouchDB «в конечном итоге согласуются». Это означает, что данные между узлами в конечном итоге гарантированно станут согласованными, но нет никаких гарантий относительно того, насколько быстро. Вы должны разрабатывать свои приложения с учетом этого.

Сказав это, вы можете кое-что сделать, чтобы увеличить вероятность того, что данные будут реплицироваться быстрее. В частности, обратите внимание на опции для репликации в PouchDB .

Особый интерес, исходя из вашего описания, представляют варианты retry и back_off_function. Если PouchDB обнаружит, что вы находитесь в автономном режиме, он начнет вводить задержки, до 10 минут, между репликациями. Это может быть то, что вы испытываете.

Вы можете отключить параметр повтора (и вручную или программно перезапустить репликацию, когда обнаружите, что ваш клиент снова подключен к сети), или написать пользовательскую функцию отключения, чтобы ограничить максимальное время для того, что вам удобно. .

...