2014-06-12 3 views
1

클라이언트와의 동기화 충돌을 관리 할 수 ​​있습니까?PouchDB - 수동으로 충돌 관리

pouchDB가 동기화를 수행하고 충돌을 감지하면 PouchDB가 동기화하려고하는 로컬 문서와 CouchDB doc의 마지막 버전을 가져올 수 있습니까? 두 문서를 모두 구할 수 있다면 사용자에게 표시 할 수 있으며 유지할 버전을 선택할 수 있습니다 ...

답변

5

CouchDB 및 PouchDB는 해결하기 위해 설계 되었기 때문에 운이 좋았습니다.

기본적으로 CouchDB docs on conflict resolution에서 읽을 수 있습니다. 거기에있는 모든 내용이 PouchDB에도 적용되어야합니다. (그렇지 않으면 버그입니다.;)). CouchDB wiki에는 좋은 글쓰기가 있습니다.

편집 : 그래서 당신이 (PouchDB에서 {conflicts:true}) ?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-로 시작하여 둘 다 개정 트리의 동일한 레벨에 있음을 나타냅니다.

가 충돌하는 버전을 얻으려면, 당신은 단지 충돌 회전을 잡고 전화 :

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

을 그리고 당신이 얻을 :

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

그래서 사용자에게 두 개의 충돌 버전을 제시 한 후, 그 다음 결과를 결합하거나 잃는 버전을 선택하거나 원하는 것을 무엇이든지 위에 둘 모두의 위에 세 번째 개정판을 추가 할 수 있습니다. 이 다음 개정판에는 접두어 3이 붙습니다. 이해가 되니?

편집 : 충돌하는 버전을 삭제해야합니다. 그렇지 않으면 여전히 _conflicts으로 표시됩니다. this answer을 참조하십시오.

+0

그가 말한 것 : –

+0

제 생각에는 정확하게 제 질문을 표현하지 못했을 것입니다. 문제는 어떻게 할 것인가입니다. 나는 내 클라이언트 중 하나가 서버와 충돌 할 때 여러 pouchdb 클라이언트가있는 couchdb 서버가 있으므로 409 오류가 발생합니다 (couchdb wiki의 충돌 방지 장). PouchDB는 투명하게 동기화를 수행하므로 서버와 클라이언트의 충돌하는 문서를 어떻게 얻을 수 있습니까? db.change 콜백에서 {status : 409, name : "conflict", 메시지 : "Document update conflict", 오류 : true, toString : function} 오류 메시지가 나타납니다. – ncohen

+0

문서를 가져올 때'conflicts = true' ([link] (https://wiki.apache.org/couchdb/HTTP_Document_API#Special_Fields))를 사용하십시오. 좀 더 자세한 내용으로 내 대답을 편집했습니다. – nlawson