PouchDB - 手动管理冲突

nco*_*hen 2 couchdb pouchdb

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

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

nla*_*son 7

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

基本上,您可以阅读有关冲突解决CouchDB文档.那里的一切也应该适用于PouchDB.(如果没有,那就是一个bug.;)).该CouchDB的维基也有一个很好的书面记录.

编辑:为了提供更多细节,您需要使用?conflicts=true({conflicts:true}在PouchDB中)获取文档.例如,你将获取这样的文档:

http://localhost:5984/db1/foo?conflicts=true
Run Code Online (Sandbox Code Playgroud)

然后像这样得到一个doc:

{
  "_id":"foo",
  "_rev":"2-f3d4c66dcd7596419c76b2498b3ba21f",
  "notgonnawork":"this is from the second db",
  "_conflicts":["2-c1592ce7b31cc26e91d2f2029c57e621"]
}
Run Code Online (Sandbox Code Playgroud)

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

要获得冲突的版本,您只需抓住冲突的转速并调用:

http://localhost:5984/db1/foo?rev=2-c1592ce7b31cc26e91d2f2029c57e621
Run Code Online (Sandbox Code Playgroud)

你得到:

{
  "_id":"foo",
  "_rev":"2-c1592ce7b31cc26e91d2f2029c57e621",
  "notgonnawork":"this is from the first database"
}
Run Code Online (Sandbox Code Playgroud)

因此,在向用户呈现两个冲突版本之后,您可以在这两个版本之上添加第三个版本,这些版本要么结合结果,要么选择丢失版本,或者您想要的任何内容.下一版本将以3为前缀.合理?

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