3

是否可以管理来自客户端的同步冲突?

我的意思是,当 pouchDB 进行同步并检测到冲突时,是否可以获得本地文档 PouchDB 正在尝试同步和 CouchDB 文档的最新版本?如果我能得到这两个文档,我可以将它们显示给用户,他可以选择保留哪个版本......

4

1 回答 1

8

你很幸运,因为这正是 CouchDB 和 PouchDB 旨在解决的问题。

基本上你可以阅读CouchDB docs on conflict resolution。那里的所有内容也应该适用于 PouchDB。(如果没有,那就是一个错误。;))。CouchDB wiki也有一篇不错的文章。

编辑:所以要提供更多详细信息,您需要使用?conflicts=true{conflicts:true}在 PouchDB 中)获取文档。例如,您将获取这样的文档:

http://localhost:5984/db1/foo?conflicts=true

并像这样得到一个文档:

{
  "_id":"foo",
  "_rev":"2-f3d4c66dcd7596419c76b2498b3ba21f",
  "notgonnawork":"this is from the second db",
  "_conflicts":["2-c1592ce7b31cc26e91d2f2029c57e621"]
}

在这里,我从另一个数据库引入了冲突,并且该数据库的修订版(随机)获胜。本文档的当前版本以 2- 开头,冲突版本也以 2- 开头,表示它们都在版本树的同一级别。

要获得冲突的版本,您只需获取冲突的 rev 并调用:

http://localhost:5984/db1/foo?rev=2-c1592ce7b31cc26e91d2f2029c57e621

你得到:

{
  "_id":"foo",
  "_rev":"2-c1592ce7b31cc26e91d2f2029c57e621",
  "notgonnawork":"this is from the first database"
}

因此,在向用户展示这两个冲突的版本之后,您可以在这两个版本之上添加第三个修订版,它可以结合结果,或者选择丢失的版本,或者您想要的任何内容。下一个版本将以 3- 为前缀。说得通?

编辑:显然您还需要删除有冲突的版本,否则它仍会显示在_conflicts. 看到这个答案

于 2014-06-12T17:44:48.650 回答