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

通过HTTP连接的PouchDB闲置数分钟后断开报错该如何处理?

401错误根因

你遇到的闲置后返回401的问题90%以上不是HTTP连接超时导致,而是CouchDB默认的会话令牌过期导致:CouchDB默认会话有效期为10分钟,闲置期间没有新请求刷新会话有效期,令牌过期后新请求就会返回未授权错误。

修复方案
  • 方案1:调整CouchDB会话有效期
    修改CouchDB配置文件中[couch_httpd_auth]段的timeout参数,单位为秒,示例配置设置为24小时有效期:
[couch_httpd_auth]
timeout = 86400

该方案适合对安全性要求不高的内部应用,高敏感业务不建议设置过长有效期。

  • 方案2:PouchDB请求层拦截自动重认证
    初始化PouchDB远程实例时自定义fetch方法,捕获401错误后先完成重新认证再重试请求,示例代码:
// 自定义fetch拦截逻辑
const customFetch = async (url, opts) => {
  let res = await PouchDB.fetch(url, opts);
  // 捕获401认证失效
  if (res.status === 401) {
    // 调用你自己的登录逻辑获取新的Authorization头
    const newAuthToken = await yourLoginFunction();
    opts.headers.set('Authorization', `Bearer ${newAuthToken}`);
    // 重试原请求
    res = await PouchDB.fetch(url, opts);
  }
  return res;
};

// 初始化远程DB时传入自定义fetch
const remoteDB = new PouchDB('https://你的CouchDB地址/数据库名', {
  fetch: customFetch
});
  • 方案3:心跳保活刷新会话
    设置定时任务,每隔小于会话有效期的间隔(比如默认10分钟有效期的话每8分钟)发送一次轻量请求刷新会话,同时检测连接状态:
setInterval(() => {
  remoteDB.info().catch(err => {
    // 这里可以统一处理连接错误或者认证错误
    console.error('数据库连接异常', err);
  });
}, 8 * 60 * 1000);
连接异常/认证失效感知方法

PouchDB没有单独的超时事件,但所有操作的错误都可以通过如下两种方式统一捕获:

  1. 全局拦截所有数据库操作的返回错误,判断错误字段即可识别对应异常:
  • 认证失效:err.status === 401 或者 err.name === 'unauthorized'
  • 连接超时/网络中断:err.name === 'network_error' 或者 err.message 包含超时关键字
  1. 如果你使用了PouchDB的实时同步API,直接监听同步对象的error事件即可:
const syncTask = localDB.sync(remoteDB, {
  live: true,
  retry: true // 开启后网络错误会自动重试
});

syncTask.on('error', err => {
  if (err.status === 401) {
    // 触发重认证逻辑
  } else if (err.name === 'network_error') {
    // 触发自定义重连逻辑(开启retry参数可省略这步)
  }
});

内容的提问来源于stack exchange,提问作者tps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:06:03