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

时间:2014-11-12 17:02:43

标签: couchdb pouchdb

我有一个使用PouchDB的移动应用程序,用于侦听来自远程C​​ouchDB服务器的更改。应用程序偶尔会推动它自己的更改。有没有办法检查我是否仍然有一个与远程CouchDB实例的活动“连接”?

到目前为止,我能提出的最佳解决方案是定期调用db.info并查看是否收到错误,但这似乎有点风险。

4 个答案:

答案 0 :(得分:0)

我假设您包含了pouchdb标记,因为您在本地使用PouchDB并在本地PouchDB和远程CouchDB之间进行复制。假设这样,PouchDB中的复制是一个事件发射器,因此您可以在syncreplicate来电中定义一系列不同的事件,see the docs包括error事件

答案 1 :(得分:0)

您是否尝试在连接丢失时发出的paused事件中查找错误?

localDB.replicate.to(remoteDB, {
  live: true,
  retry: true,
}).on('paused', (err) =>{
  console.log('paused');
  if (err) {
    alert(`No connection! ${err}`);
  }
  // replication was paused, usually because of a lost connection
}).on('change', (change)=>{
  // yo, something changed!
}).on('active', (info)=>{
  // replication was resumed
}).on('error', (err)=>{
  // totally unhandled error (shouldn't happen)
});

如果您使用的是实时复制,则在复制等待更改且pausederr时会发出undefined事件。如果出现连接中断等问题,也会发出paused事件,但会发出err个参数。

注意:我确信有更安全的方法来检查是否定义了err

来自PouchDB documentation

  

暂停(错误) - 当复制暂停时,此事件将触发   因为实时复制正在等待更改或复制   暂时失败,错误,并试图恢复。

答案 2 :(得分:0)

您需要将“重试”设置为false,否则错误事件将不会被捕获。

来自API参考:

  

error(err) - 由于无法恢复的故障导致复制停止时会触发此事件。如果重试为false,则当用户离线或发生其他网络错误时也会触发(如果您愿意,可以自行处理重试)。

试试这段代码:

    // Sync pouch - couch
db.sync(couch, {
    live: true,
    retry: false
}).on('error', (err) => {
    console.log(`A sync error occurred: ${err}`);
});

答案 3 :(得分:0)

据我所知,PouchDB没有事件通知我们同步是由于Internet连接中断而停止的。我做了一个小技巧来解决这个问题。

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

  1. 活动
  2. 更改
  3. 已暂停

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

  1. 活动
  2. 已暂停

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

因此,我为活动事件和更改事件分别设置了两个标志pouchDbSyncActiveEventpouchDbSyncChangeEvent,并将它们都初始化为false。在pouchDbSyncActiveEvent事件的回调中将true转到'active'。无论是否有互联网,它都将运行。在pouchDbSyncChangeEvent事件的回调中将true转到'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

})

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