PouchDB 7.2.2无法向下同步文档(原v6版本正常)
我处理过不少PouchDB从6.x升级到7.x后同步异常的案例,结合你的代码和现象来看,核心问题和几个关键调整点如下:
1. 修复fetch选项的返回值问题
你定义远程数据库时的fetch回调没有返回fetch的Promise结果!这是最关键的错误——PouchDB 7.x严格依赖这个返回值来处理请求响应链,没返回的话整个请求流程会直接中断,自然不会发起后续的_changes同步请求,最终触发paused事件(因为没有有效响应推进同步流程)。
修改你的远程数据库定义:
this.remote = new PouchDB( 'http://localhost:13765/db', { fetch: (url, opts) => { // 必须return fetch的Promise,让PouchDB能处理后续响应 return fetch(url, { ...opts, credentials: "include" }); }, skip_setup: true } );
PouchDB 6.x对这个问题的容错性更高,但7.x的请求处理逻辑更严谨,漏掉return直接导致同步卡住。
2. 调整Replication配置参数
PouchDB 7.x对live replication的默认参数做了调整,你可以显式添加heartbeat和batch_size参数,确保连接保持活跃并优化同步效率:
local.replicate .from(remote, { live: true, retry: true, heartbeat: 30000, // 30秒心跳,避免长连接被判定为闲置断开 batch_size: 1000 // 批量同步的文档数,可根据数据库规模调整 }) .on('change', function (change) { console.log(11330, ' changes ', change) }) .on('paused', function (info) { console.log('paused ', info) }) .on('active', function (info) { console.log('active ', info) }) .on('error', function (err) { console.log(1339, err) });
3. 验证CouchDB的CORS配置(Cookie认证必备)
虽然你提到网络请求状态都是200,但Cookie认证下CouchDB的CORS配置必须允许凭证传递:
- 确保
_config/httpd/enable_cors为true - 确保
_config/cors/credentials为true - 确保
_config/cors/origins包含你的前端域名(比如http://localhost:4200)
4. 重置本地数据库(可选)
如果之前的本地数据库残留了旧的同步状态,可能干扰新的同步流程,你可以先销毁再重建:
// 销毁旧本地库 PouchDB.destroy("data").then(() => { // 重新创建本地库 this.local = new PouchDB("data"); // 重新启动同步 this.local.replicate.from(this.remote, { live: true, retry: true }) // ...绑定同步事件 });
补充:关于pouchdb-browser的错误
你提到使用pouchdb-browser时出现Cannot read property 'then' of undefined的错误,这和上面的fetch返回值问题是同一个根源——修复fetch回调的return语句后,这个错误也会自动解决。
按照上述步骤调整后,应该能看到_changes请求正常发起,文档开始同步。
内容的提问来源于stack exchange,提问作者Wede Asmera Tseada
相关产品推荐
相关产品推荐

