通过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没有单独的超时事件,但所有操作的错误都可以通过如下两种方式统一捕获:
- 全局拦截所有数据库操作的返回错误,判断错误字段即可识别对应异常:
- 认证失效:
err.status === 401或者err.name === 'unauthorized' - 连接超时/网络中断:
err.name === 'network_error'或者err.message包含超时关键字
- 如果你使用了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
相关产品推荐
相关产品推荐

