【问题标题】:PouchDB - Manually managing conflictsPouchDB - 手动管理冲突
【发布时间】:2014-12-02 01:24:23
【问题描述】:

是否可以从客户端管理同步冲突?

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

【问题讨论】:

    标签: couchdb pouchdb


    【解决方案1】:

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

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

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

    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。见this answer

    【讨论】:

    • 我想我没有正确表达我的问题......问题更多的是你是怎么做的。我有一个带有多个 pouchdb 客户端的 couchdb 服务器,因此当我的一个客户端与服务器发生冲突时,我收到 409 错误(来自 couchdb wiki 的冲突避免章节)。由于 PouchDB 透明地进行同步,我怎样才能获得冲突的文档(服务器和客户端的)。在 db.change 回调中,我只收到错误:{status: 409, name: "conflict", message: "Document update conflict", error: true, toString: function}...如何获取文档?
    • 当您get 一个文档时,使用conflicts=true (link)。我已经用更多细节编辑了我的答案。
    • 抱歉,我错过了 PouchDB API 中的冲突参数!谢谢!顺便说一句,_conflicts 数组中的第一项是最后记录的冲突吗?
    • 我不确定,但您始终可以确定冲突的顺序,因为 revs 应该命名为 '1-<hash>''2-<hash>''3-<hash>' 等。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多