如何知道何时与远程CouchDB失去同步

cap*_*im1 6 couchdb pouchdb

我有一个使用PouchDB的移动应用程序,该应用程序侦听来自远程C​​ouchDB服务器的更改。有时,应用程序会推送自己的更改。有没有一种方法可以查看我是否仍与远程CouchDB实例保持活动的“连接”?

到目前为止,我能想到的最好的解决方案是定期调用db.info并查看是否返回错误,但这似乎有些冒险。

小智 7

据我所知,PouchDB 没有事件通知我们同步因互联网连接中断而停止。我做了一个小技巧来解决这个问题。

当同步正确发生并且您对本地 PouchDB 进行更改时,触发事件的顺序是:

  1. 积极的
  2. 改变
  3. 暂停

但是,当互联网中断时,顺序是:

  1. 积极的
  2. 暂停

未与远程数据库同步时,不会触发更改事件。

所以,我做了什么是由两个标志的积极变化事件,pouchDbSyncActiveEventpouchDbSyncChangeEvent分别与初始化既是false。打开pouchDbSyncActiveEventtrue回调的'active'事件。无论是否有互联网,这都会运行。打开pouchDbSyncChangeEventtrue回调的'change'事件。如果没有互联网,这将不会运行并且pouchDbSyncChangeEvent仍然会保留false,并且该'paused'事件将在不久之后被触发。这通知我们同步已停止。

代码

let pouchDbSyncActiveEvent = false
let pouchDbSyncChangeEvent = false

localPouchDb.sync(remoteCouchDb, {
  live: true,
  retry: true
})
.on('active', (change) => {

  pouchDbSyncActiveEvent = true

})
.on('change', (change) => {

  pouchDbSyncChangeEvent = true

})
.on('paused', (info) => {

  if(pouchDbSyncActiveEvent == true && pouchDbSyncChangeEvent == false){

    // Gotcha! Syncing with remote DB not happening!

  }
  else {

    // Everything's ok. Syncing with remote DB happening normally.

  }

  pouchDbSyncActiveEvent = false
  pouchDbSyncChangeEvent = false

})
Run Code Online (Sandbox Code Playgroud)

注意: 您可以.on按照您希望的顺序编写事件侦听器方法,但最好按照它们执行的顺序编写它们:)


sma*_*thy 0

我假设您包含该pouchdb标签,因为您在本地使用 PouchDB,并在本地 PouchDB 和远程 CouchDB 之间进行复制。sync假设是这样,PouchDB 中的复制是一个事件发射器,因此您可以在您的或调用中定义一堆不同的事件replicate,请参阅包括该事件的文档error