PouchDB-懒散地获取和复制文档

PouchDB - Lazily fetch and replicate documents

本文关键字:复制 文档 获取 PouchDB-      更新时间:2023-09-26

TL;DR:我想要一个类似Ember Data的PouchDB数据库:首先从本地存储中提取,如果找不到,则转到远程。在这两种情况下,只复制该文档。

我在PouchDB/CouchDB服务器中有一个名为Post的文档类型。我希望PouchDB查看本地存储,如果它有文档,则返回文档并开始复制。如果没有,请转到远程CouchDB服务器,获取文档,将其存储在本地PouchDB实例中,然后开始仅复制该文档在这种情况下,我不想复制整个数据库,只想复制用户已经获取的东西

我可以通过写这样的东西来实现:

var local = new PouchDB('local');
var remote = new PouchDB('http://localhost:5984/posts');
function getDocument(id) {
  return local.get(id).catch(function(err) {
    if (err.status === 404) {
      return remote.get(id).then(function(doc) {
        return local.put(id);
      });
    }
    throw error;
  });
}

这也不能处理复制问题,但这是我想要做的事情的大致方向

我想我可以自己写这段代码,但我想知道是否有一些内置的方法可以做到这一点。

不幸的是,您所描述的并不完全存在(至少作为一个内置函数)。使用上面的代码(这是完美的BTW:),您肯定可以从本地回退到远程,但local.put()会给您带来问题,因为本地文档最终会使用与远程文档不同的_rev,这可能会在以后的复制中造成混乱(这将被解释为冲突)。

您应该能够使用{revs: true}获取具有修订历史记录的文档,然后使用{new_edits: false}插入以正确复制丢失的文档,同时保留修订历史记录(这是复制器在后台所做的)。看起来是这样的:

var local = new PouchDB('local');
var remote = new PouchDB('http://localhost:5984/posts');
function getDocument(id) {
  return local.get(id).catch(function(err) {
    if (err.status === 404) {
      // revs: true gives us the critical "_revisions" object,
      // which contains the revision history metadata
      return remote.get(id, {revs: true}).then(function(doc) {
        // new_edits: false inserts the doc while preserving revision
        // history, which is equivalent to what replication does
        return local.bulkDocs([doc], {new_edits: false});
      }).then(function () {
        return local.get(id); // finally, return the doc to the user
      });
    }
    throw error;
  });
}

这应该行得通!如果有帮助,请告诉我。