同步配置下远程数据库宕机后错误回调未触发的问题咨询
我完全懂你的困扰——很多数据库同步工具(比如PouchDB和CouchDB的组合)默认只在同步初始化阶段触发连接错误回调,等同步已经跑起来之后,远程数据库突然宕机的情况,确实不会主动触发你原来的错误处理逻辑。下面是几个亲测有效的解决方案,帮你实时检测连接状态并显示离线指示器:
方案1:定期主动检测远程数据库连通性
这是最直接的方式,通过定时ping远程数据库的基础接口来判断状态:
- 写一个定时任务,每隔10-30秒(根据你的需求调整)发起一个简单的请求到远程数据库的
/_info端点:async function checkRemoteDBStatus() { try { const response = await fetch('http://localhost:5984/_info', { method: 'GET', timeout: 5000 // 设置5秒超时,避免长时间等待 }); if (response.ok) { // 连接正常,隐藏离线指示器 updateOfflineIndicator(false); } else { // 数据库返回错误状态,标记离线 updateOfflineIndicator(true); } } catch (err) { // 请求失败(比如连接拒绝、超时),标记离线 updateOfflineIndicator(true); } } // 启动定时检测,每15秒一次 setInterval(checkRemoteDBStatus, 15000); - 注意:不要把检测间隔设得太近,避免给服务器造成不必要的压力;同时记得处理请求超时的情况,防止页面卡住。
方案2:监听同步过程的状态变化事件(针对PouchDB)
如果你用的是PouchDB做同步,它的同步实例提供了paused和active事件,可以用来判断连接状态:
const sync = PouchDB.sync(localDB, 'http://localhost:5984/mydb', { live: true, retry: true // 开启自动重试,连接恢复时会重新激活同步 }); // 同步暂停时触发(通常是连接失败导致) sync.on('paused', (err) => { if (err) { // 存在错误对象,说明是连接问题导致的暂停 updateOfflineIndicator(true); } }); // 同步重新激活时触发(连接恢复) sync.on('active', () => { updateOfflineIndicator(false); }); // 捕获同步过程中的其他错误 sync.on('error', (err) => { if (err.message.includes('ECONNREFUSED') || err.status === 0) { updateOfflineIndicator(true); } console.error('同步错误:', err); });
这里的retry选项很关键,它会让PouchDB在连接中断后自动尝试重连,当重连成功时active事件会触发,你就可以更新状态了。
方案3:结合浏览器的在线状态API做辅助判断
浏览器提供了navigator.onLine属性,可以快速判断设备是否处于联网状态,但它只能检测设备的网络连接,不能直接判断是否能访问你的远程数据库,所以建议和上面的方案配合使用:
// 监听浏览器在线/离线事件 window.addEventListener('online', () => { // 设备联网后,主动检测一次远程数据库状态 checkRemoteDBStatus(); }); window.addEventListener('offline', () => { // 设备离线,直接显示离线指示器 updateOfflineIndicator(true); });
小提示
- 记得在页面初始化时先调用一次
checkRemoteDBStatus(),确保初始状态正确; - 如果你的数据库需要认证,记得在请求中带上认证信息(比如Basic Auth的头);
- 可以把离线状态存在全局变量或者状态管理工具(比如Vuex、Redux)里,方便页面各组件调用。
内容的提问来源于stack exchange,提问作者ndequeker
相关产品推荐
相关产品推荐

