dan*_*nza 2 architecture frontend pouchdb
在单页面应用程序上工作我必须编写大量的样板代码才能与服务器端数据同步.
PouchDB为这个问题提供了一个优雅的解决方案,允许在客户端本地访问数据.
我不明白的是,在数据库太大而不能完全适合浏览器内存的情况下,Pouch是否适合作为数据库代理.
据我所知,Pouch可以复制整个远程数据库,因此可以在整个数据库适合浏览器内存的情况下使用.
假设我有一个包含所有维基百科文章的数据库,我想在客户端操作其中的一部分.复制不是要走的路,需要的是代理.例如,当在客户端本地发出查询时,只应传输匹配的结果.仅对复制值运行查询是不可行的,因为无法在本地复制整个数据库.
你是对的,PouchDB同步不会真正做你想做的事情.它旨在使用服务器端设计文档同步整个数据库或数据库的预定义子集.
如果我是你,我可能仍会使用PouchDB,但我会手动处理同步.像这样的东西:
var localDB = new PouchDB('localDB');
var remoteDB = new PouchDB('http://some-site.com:5984/somedb');
function searchForDocs(docId) {
// try the local DB first
localDB.get(docId).catch(function (err) {
if (err.name !== 'not_found') {
throw error;
}
// not found, so fall back to the remote DB
return remoteDB.get(docId).then(function (doc) {
// cache in the local DB
delete doc._rev;
return localDB.put(doc).then(function () {
return doc;
});
});
}).then(function (doc) {
// do something with our doc
}).catch(function (err) {
// handle any errors along the way
});
}
Run Code Online (Sandbox Code Playgroud)
使用get()在这里有点简单; 在您的维基百科案例中,您可能希望allDocs({startkey: query, endkey: query + '\uffff'})查找ID以查询开头的所有文档.或者您可以使用二级索引.
因此,虽然您不会从PouchDB的内置同步中获益,但您可以获得与客户端相对于服务器编写相同代码的优势,以及PouchDB的跨浏览器支持.所以我认为这不是一个糟糕的方式.