PouchDB 复制在复制时抛出错误

Posted

技术标签:

【中文标题】PouchDB 复制在复制时抛出错误【英文标题】:PouchDB Replication throws error upon replication 【发布时间】:2017-04-13 11:05:43 【问题描述】:

当我尝试使用本地 pouchdb 复制远程 couchdb(在 ubuntu 14.04- 64 bit 上)时,我遇到了这个奇怪的错误。 我的 couchdb 通过nginx 代理并在https 上运行。从客户端到 nginx 的流量是 ssl,而从 nginx 到 couchdb 的流量是简单的 http。在 couchdb 中启用了 Cors 请求。 Nginx 配置与 couchdb recommended 最相似。从数据库同步工作正常,但是在通过 chrome Version 54.0.2840.100 (64-bit) 调试时出现以下错误。

以下是错误的完整堆栈跟踪。

raven.min.js:2 Error: There was a problem getting docs. at finishBatch (http://localhost:8100/lib/pouchdb/dist/pouchdb.js:6410:13) at processQueue (http://localhost:8100/lib/ionic/js/ionic.bundle.js:27879:28) at http://localhost:8100/lib/ionic/js/ionic.bundle.js:27895:27 at Scope.$eval (http://localhost:8100/lib/ionic/js/ionic.bundle.js:29158:28) at Scope.$digest (http://localhost:8100/lib/ionic/js/ionic.bundle.js:28969:31) at http://localhost:8100/lib/ionic/js/ionic.bundle.js:29197:26 at completeOutstandingRequest (http://localhost:8100/lib/ionic/js/ionic.bundle.js:18706:10) at http://localhost:8100/lib/ionic/js/ionic.bundle.js:18978:7 at d (http://localhost:8100/lib/raven-js/dist/raven.min.js:2:4308) undefineda.(anonymous function) @ raven.min.js:2(anonymous function) @ ionic.bundle.js:25642(anonymous function) @ ionic.bundle.js:22421(anonymous function) @ angular.min.js:2processQueue @ ionic.bundle.js:27887(anonymous function) @ ionic.bundle.js:27895$eval @ ionic.bundle.js:29158$digest @ ionic.bundle.js:28969(anonymous function) @ ionic.bundle.js:29197completeOutstandingRequest @ ionic.bundle.js:18706(anonymous function) @ ionic.bundle.js:18978d @ raven.min.js:2 raven.min.js:2 Paused in lessondb replicate Error: There was a problem getting docs. at finishBatch (http://localhost:8100/lib/pouchdb/dist/pouchdb.js:6410:13) at processQueue (http://localhost:8100/lib/ionic/js/ionic.bundle.js:27879:28) at http://localhost:8100/lib/ionic/js/ionic.bundle.js:27895:27 at Scope.$eval (http://localhost:8100/lib/ionic/js/ionic.bundle.js:29158:28) at Scope.$digest (http://localhost:8100/lib/ionic/js/ionic.bundle.js:28969:31) at http://localhost:8100/lib/ionic/js/ionic.bundle.js:29197:26 at completeOutstandingRequest (http://localhost:8100/lib/ionic/js/ionic.bundle.js:18706:10) at http://localhost:8100/lib/ionic/js/ionic.bundle.js:18978:7 at d (http://localhost:8100/lib/raven-js/dist/raven.min.js:2:4308)

chrome中的网络日志显示部分请求被取消

我正在使用 couchdb 版本 - 1.6.1 和 pouchdb 版本 - 5.3.2。 我使用以下命令来复制 dbs:

myDB.replicate.from(remote_db_url, live: true, retry: true, heartbeat: false ) 如果有人能对心跳参数有所了解,那就太好了。

【问题讨论】:

【参考方案1】:

注意:我无法解决您描述的错误。也许完整的堆栈跟踪而不是屏幕截图可能会有所帮助...

但我会尝试对心跳参数进行一些说明:阅读docs 已经有所帮助。查看replicate 方法的高级选项:

options.heartbeat:配置 CouchDB 支持的心跳,使更改连接保持活动状态。

那么让我们看看CouchDB's docs 看看这个参数的作用:

网络是一种棘手的野兽,有时您不知道是没有变化还是您的网络连接过时了。如果您添加另一个查询参数 heartbeat=N,其中 N 是一个数字,CouchDB 将每 N 毫秒向您发送一个换行符。只要您收到换行符,您就知道没有新的更改通知,但 CouchDB 仍然准备好在发生下一个更改通知时向您发送。

所以基本上它似乎是一种轮询机制,每 n 毫秒(其中 n 是您指定的 heartbeat 值)发送一条消息(例如换行符),以确保两个数据库之间的连接仍然有效。

将值设置为false 将禁用此机制。


关于这个参数可以使用哪个值: PouchDB docs 进一步说明,changes 方法有一个类似的参数,描述如下:

options.heartbeat:仅适用于 http 适配器,服务器发出心跳以保持长连接打开的时间(以毫秒为单位)。默认为 10000(10 秒),使用 false 禁用默认值。

【讨论】:

我们不应该对 https 请求使用心跳吗? 我已经添加了你提到的错误的完整堆栈跟踪

以上是关于PouchDB 复制在复制时抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

PouchDB 和 SvelteKit

PouchDB + CouchDB 用于具有权限管理的离线公司应用程序(IBM Domino 替换)

未捕获的TypeError:PouchDB.plugin不是一个函数

PouchDB 的外部访问,同步错误

使用 PouchDB 的 Ionic 应用程序性能问题

pouchdb db.login 不是函数