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