Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道何时我们';我与远程CouchDB失去了同步_Couchdb_Pouchdb - Fatal编程技术网

如何知道何时我们';我与远程CouchDB失去了同步

如何知道何时我们';我与远程CouchDB失去了同步,couchdb,pouchdb,Couchdb,Pouchdb,我有一个使用PockDB的移动应用程序,可以监听来自远程CouchDB服务器的更改。偶尔,应用程序会将自己的更改推高。有没有办法检查我是否仍然有到远程CouchDB实例的活动“连接” 到目前为止,我能想到的最好的解决方案是定期调用db.info,看看是否返回错误,但这似乎有点冒险。我假设您包含了pockdb标记,因为您在本地使用pockdb,并且正在本地pockdb和远程CouchDB之间复制。假设是这样,PockDB中的复制是一个事件发射器,因此您可以在sync或replicate调用中定义一

我有一个使用PockDB的移动应用程序,可以监听来自远程CouchDB服务器的更改。偶尔,应用程序会将自己的更改推高。有没有办法检查我是否仍然有到远程CouchDB实例的活动“连接”


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

我假设您包含了
pockdb
标记,因为您在本地使用pockdb,并且正在本地pockdb和远程CouchDB之间复制。假设是这样,PockDB中的复制是一个事件发射器,因此您可以在
sync
replicate
调用中定义一系列不同的事件,包括
error
事件。

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

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)
});
如果您使用的是实时复制,则当复制等待更改且
err
未定义时,会发出
暂停
事件。如果存在连接中断之类的问题,也会发出
paused
事件,但带有
err
参数

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

从:

暂停(err)-复制暂停时触发此事件 因为实时复制正在等待更改,或者复制已停止 暂时失败,出现错误,正在尝试恢复

您需要将“重试”设置为false,否则将无法捕获错误事件

从API参考中:

错误(err)-当复制由于不可恢复的故障而停止时,将触发此事件。如果retry为false,则当用户脱机或发生另一个网络错误时也会触发此操作(因此,如果需要,您可以自己处理重试)

请尝试以下代码:

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

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

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

  • 活跃的
  • 改变
  • 停顿
  • 但是,当互联网断开时,顺序是:

  • 活跃的
  • 停顿
  • 未与远程数据库同步时,不会触发任何更改事件

    因此,我所做的是为活动和更改事件分别设置两个标志,
    PockDBsyncativeEvent
    PockDBsyncChangeEvent
    ,并将它们初始化为
    false
    。在
    'active'
    事件的回调中,将
    BackDBsyncativeEvent
    转到
    true
    。无论是否有互联网,这都将运行。在
    'change'
    事件的回调中,将
    dbsyncchangeent
    设置为
    true
    。如果没有internet,此操作将不会运行,
    BackDBsyncChangeEvent
    仍将保持
    false
    ,并且
    “暂停”
    事件将很快被触发。这会通知我们同步已停止

    代码

    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
    事件侦听器方法,但最好按照执行顺序编写它们:)

    我使用的方法是正确的。我忘了提那件事了。复制和同步选项不会在“连接”丢失时触发事件。如果您失去internet连接,会发生什么情况?在你试图推动变革之前,你不会知道发生了什么。。“倾听”似乎无声地失败了。哦,对了。我知道你现在想要什么了。我不确定是否有办法做到这一点。整个想法是,你不在乎连接是打开还是关闭,你只需要使用本地数据库,只要连接恢复同步,就会恢复syncing resumes.Poop。我想我可以回到使用db.info定期检查连接的状态。让我问一下,为什么您关心连接何时启动/关闭?当“连接”关闭时,我需要提醒用户他们将不再接收更新。我还需要禁用用户发送更新的功能(如果连接断开,更新将排队)。已尝试-不起作用。启动同步,然后关闭远程数据库-暂停
    err
    is
    undefined
    在同步完成后触发暂停。BackDB 7.0,0问题的最佳答案。