我用远程数据库编写了pouchdb sync(在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中保存的数据立即保存在远程数据库中。
答案 0 :(得分:1)
这是预期的行为。 CouchDB和扩展名PouchDB最终都是一致的。这意味着跨节点的数据最终可以保证变得一致,但是不能保证速度有多快。您应该牢记这一点来设计应用。
话虽如此,您可以做一些事情来帮助增加更快地复制数据的机会。尤其要注意options for replication in PouchDB。
根据您的描述,特别感兴趣的是retry
和back_off_function
选项。如果PouchDB检测到您处于脱机状态,它将在复制之间开始引入最长10分钟的延迟。那可能就是你正在经历的。
您可以考虑禁用重试选项(并在检测到客户端重新联机时手动或以编程方式重新启动复制),或编写自定义的退出功能,以将最大时间限制为您满意的时间