PouchDB - 延迟获取和复制文档
PouchDB - Lazily fetch and replicate documents
TL;DR:我想要一个 PouchDB 数据库,其行为类似于 Ember 数据:首先从本地存储获取,如果找不到,则转到远程。在这两种情况下,仅复制该文档。
我的 PouchDB/CouchDB 服务器中有一个名为 Post
的文档类型。我希望 PouchDB 查看本地存储,如果它有文档,return 文档并开始复制。如果没有,转到远程 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;
});
}
这也没有解决复制问题,但这是我想做的大方向。
我想我可以自己编写这段代码,但我想知道是否有一些内置的方法可以做到这一点。
不幸的是,您所描述的并不完全存在(至少作为 built-in 函数)。您绝对可以使用上面的代码(这是完美的 BTW :))从本地返回到远程,但是 local.put()
会给您带来问题,因为本地文档最终会得到与远程文档,稍后可能会干扰复制(这将被解释为冲突)。
您应该能够使用 {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;
});
}
应该可以!让我知道是否有帮助。
TL;DR:我想要一个 PouchDB 数据库,其行为类似于 Ember 数据:首先从本地存储获取,如果找不到,则转到远程。在这两种情况下,仅复制该文档。
我的 PouchDB/CouchDB 服务器中有一个名为 Post
的文档类型。我希望 PouchDB 查看本地存储,如果它有文档,return 文档并开始复制。如果没有,转到远程 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;
});
}
这也没有解决复制问题,但这是我想做的大方向。
我想我可以自己编写这段代码,但我想知道是否有一些内置的方法可以做到这一点。
不幸的是,您所描述的并不完全存在(至少作为 built-in 函数)。您绝对可以使用上面的代码(这是完美的 BTW :))从本地返回到远程,但是 local.put()
会给您带来问题,因为本地文档最终会得到与远程文档,稍后可能会干扰复制(这将被解释为冲突)。
您应该能够使用 {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;
});
}
应该可以!让我知道是否有帮助。