我有一个使用PouchDB的移动应用程序,用于侦听来自远程CouchDB服务器的更改。应用程序偶尔会推动它自己的更改。有没有办法检查我是否仍然有一个与远程CouchDB实例的活动“连接”?
到目前为止,我能提出的最佳解决方案是定期调用db.info并查看是否收到错误,但这似乎有点风险。
答案 0 :(得分:0)
我假设您包含了pouchdb
标记,因为您在本地使用PouchDB并在本地PouchDB和远程CouchDB之间进行复制。假设这样,PouchDB中的复制是一个事件发射器,因此您可以在sync
或replicate
来电中定义一系列不同的事件,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)
});
如果您使用的是实时复制,则在复制等待更改且paused
为err
时会发出undefined
事件。如果出现连接中断等问题,也会发出paused
事件,但会发出err
个参数。
注意:我确信有更安全的方法来检查是否定义了err
。
暂停(错误) - 当复制暂停时,此事件将触发 因为实时复制正在等待更改或复制 暂时失败,错误,并试图恢复。
答案 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进行更改时,触发事件的顺序为:
但是,当互联网断开时,顺序为:
未与远程数据库进行同步时,不会触发更改事件。
因此,我为活动事件和更改事件分别设置了两个标志pouchDbSyncActiveEvent
和pouchDbSyncChangeEvent
,并将它们都初始化为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
事件监听器方法,但是最好按执行顺序编写它们:)