You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同步配置下远程数据库宕机后错误回调未触发的问题咨询

我完全懂你的困扰——很多数据库同步工具(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:40:16