PouchDB 复制流
ReadableStreams 和 WritableStreams 用于PouchDB/CouchDB复制.
基本上,你可以复制两个数据库, 只需把溪流连接起来.
这有许多用途:
- 将数据库丢入文件,然后将同一文件加载到另一个数据库.
- 通过将 CouchDB 的内容倾倒到 HTTP 端点来快速地进行初始复制,然后在浏览器中被装入 PouchDB .
- 在网络套接字上复制吗 ? 蓝牙? 为了NFC? 为什么不呢? 由于复制流只是JSON平版文字,你可以通过任何传输机制发送.
- 定期备份您的数据库.
工具套装
实例
你用得着 pouchdb-replication-stream 将:
使用量
我们假设你有两个数据库 不论他们是偏僻的还是本地的:
var db1 = new PouchDB('mydb');
var db2 = new PouchDB('http://localhost:5984/mydb');
让我们将 db1 的全部内容丢弃到一个使用 dump()数字 :
var ws = fs.createWriteStream('output.txt');
db1.dump(ws).then(function (res) {
// res should be {ok: true}
});
现在,让我们把文件读到另一个数据库,使用 load()数字 :
var rs = fs.createReadStream('output.txt');
db2.load(rs).then(function (res) {
// res should be {ok: true}
});
恭喜,你的数据库正在同步 和以前一样
db1.replicate.to(db2);
API 密码
db.dump( 流 [, 选择 )
丢弃 db 改为 stream 用给定的 opts返回承诺.
这个 opts 直接传递给 replicate() API 密码 如本文所述。特别是,您可能想要设定:
batch_size- 每个输出块中要堆放多少文件。 默认为50.since- 那个seq从那里开始读取变化.
允许您通过的选择有: batch_size, (中文(简体) ), batches_limit, (中文(简体) ), filter, (中文(简体) ), doc_ids, (中文(简体) ), query_params, (中文(简体) ), since,以及 view。 。 。 .
db. 负荷( 流)
从给定的装入更改 stream 输入 db返回承诺.
这是一种"同能"操作,所以可以多次调用,不会改变结果.
使用时警告 pouchdb-load
这个 邮袋装入量 插件有自己的 db.load()
函数,与此函数不相容。 如果您想要在同一时间使用两个插件
时间,那么你需要做:
var PouchDB = require('pouchdb');
var load = require('pouchdb-load');
PouchDB.plugin({
loadIt: load.load
});
// Then load `pouchdb-replication-stream` normally
这样你就可以用 pouchdb-load 通过 db.loadIt(),不会打出 db.load() 从此插件。 (您必须使用浏览/ Webpack, 因为没有预建) loadIt() 版本. )
设计
复制流是这样的:
{"version":"0.1.0","db_type":"leveldb","start_time":"2014-09-07T21:31:01.527Z","db_info":{"doc_count":3,"update_seq":3,"db_name":"testdb"}}
{"docs":[{"_id":"doc1","_rev":"1-x","_revisions":{"start":1,"ids":["x"]},"foo":"bar"}]}
{"docs":[{"_id":"doc2","_rev":"1-y","_revisions":{"start":1,"ids":["y"]},"foo":"baz"}]}
{"docs":[{"_id":"doc3","_rev":"1-z","_revisions":{"start":1,"ids":["z"]},"foo":"quux"}]}
{"seq":3}
只是NDJ - Newline Delimited JSON(英语:Newline Delimited JSON). 每行都是要装入目标数据库(使用 bulkDocs() 与 {new_edits: false}) (中文(简体) ).
第一行是包含一些基本信息的头条,比如数据库中的文档数量和复制流协议版本. 这些信息对显示进程栏很有用 load() 进程,或用于处理后期版本,以防协议发生变化.
此复制流是 专有,意思是,你可以将它加载到目标数据库中 任何次数,它会像你只做过一次一样.
在结尾 load() 目标数据库将完全按照从源数据库复制的方式运作。 修订散列、冲突、附件和文件内容均忠实地运输.
一些行可能包含 seqs;这些用作检查站。 这个 seq 直行表示,“当您已经装入所有前列文件时,您现在正在更新 seq seq""("史记")
目前,附件只是作为基数64编码字符串,ala CouchDB的 _all_docs 与 attachments=true 财务报告和审定财务报表 Accept: application/json。 。 。 .
安装
要使用此插件, 请从 dist 文件夹并包含在 pouchdb.js 在 HTML 页面中:
<script src="pouchdb.js"></script>
<script src="pouchdb.replication-stream.js"></script>
您也可以使用 Bower :
bower install pouchdb-replication-stream
或者在Node.js中使用,只是npm安装:
npm install pouchdb-replication-stream
在Node.js,你可以把它附在 PouchDB 对象使用下列代码:
var PouchDB = require('pouchdb');
var replicationStream = require('pouchdb-replication-stream');
PouchDB.plugin(replicationStream.plugin);
PouchDB.adapter('writableStream', replicationStream.adapters.writableStream);
没有垃圾文件直接流出
在节点.js或与 Browserify,你可以使用一个 MemoryStream 直接流出而不向文件倾斜。 举个例子:
var Promise = require('bluebird');
var PouchDB = require('pouchdb');
var replicationStream = require('pouchdb-replication-stream');
var MemoryStream = require('memorystream');
PouchDB.plugin(replicationStream.plugin);
PouchDB.adapter('writableStream', replicationStream.adapters.writableStream);
var stream = new MemoryStream();
var source = new PouchDB('http://localhost:5984/source_db');
var dest = new PouchDB('local_destination');
Promise.all([
source.dump(stream),
dest.load(stream)
]).then(function () {
console.log('Hooray the stream replication is complete!');
}).catch(function (err) {
console.log('oh no an error', err);
});
如果您正在使用此程序, 此程序也会在浏览器中工作 浏览器。 。 。 .
如果你不使用浏览器, 你可以下载 MemoryStream 从 https://wzrd.in/standone/memorystream@latest 互联网档案馆的存檔,存档日期2013-12-21 并将作为 window.memorystream。 。 。 .
示例
<script src="lib/pouchdb/dist/pouchdb.js"></script>
<script src="lib/pouchdb-replication-stream/dist/pouchdb.replication-stream.js"></script>
<script src="lib/memorystream/memorystream.js"></script>
var localDB = new PouchDB('foo');
var remoteDB = new PouchDB('bar');
var source = new PouchDB('http://localhost:5984/source_db');
var dest = new PouchDB('local_destination');
Promise.all([
source.dump(stream),
dest.load(stream)
]).then(function () {
console.log('Hooray the stream replication is complete!');
}).catch(function (err) {
console.log('oh no an error', err);
});
倾倒到字符串
你用得着 MemoryStream 全文
流并倾倒到字符串上.
示例
var PouchDB = require('pouchdb');
var replicationStream = require('pouchdb-replication-stream');
var MemoryStream = require('memorystream');
PouchDB.plugin(replicationStream.plugin);
PouchDB.adapter('writableStream', replicationStream.adapters.writableStream);
var dumpedString = '';
var stream = new MemoryStream();
stream.on('data', function(chunk) {
dumpedString += chunk.toString();
});
var db = new PouchDB('my_db');
db.dump(stream).then(function () {
console.log('Yay, I have a dumpedString: ' + dumpedString);
}).catch(function (err) {
console.log('oh no an error', err);
});
这将在浏览器通过 浏览器。 。 。 .
如果你不使用浏览器, 你可以下载 MemoryStream 从 https://wzrd.in/standone/memorystream@latest 互联网档案馆的存檔,存档日期2013-12-21 并将作为 window.memorystream。 。 。 .
示例
<script src="lib/pouchdb/dist/pouchdb.js"></script>
<script src="lib/pouchdb-replication-stream/dist/pouchdb.replication-stream.js"></script>
<script src="lib/memorystream/memorystream.js"></script>
var db = new PouchDB('my_db');
var MemoryStream = window.MemoryStream;
var dumpedString = '';
stream.on('data', function(chunk) {
dumpedString += chunk.toString();
});
db.dump(stream).then(function () {
console.log('Yay, I have a dumpedString: ' + dumpedString);
}).catch(function (err) {
console.log('oh no an error', err);
});
已知的陷阱
读取错误 400 EconnRESET
基本上这意味着您的 CouchDB 无法处理所有同时发生的请求 。 最可能的原因是 您的一份文件上有200+附件 .
绕过这个错误的一个简单方法就是限制全球代理 maxSockets , 该程序管理协议 http 请求的最大数量 .
require('http').globalAgent.maxSockets = 25;
试图加速PouchDB复制?
如果您在浏览器中使用了这个库,那么它不会加速复制. 整点是将 HTTP 请求的数量缩入一个流中,然后向客户端发送一个大块。 如果您在客户端使用它,那么它仍然会向服务器提出许多小请求,这很慢.
您可能想要的是使用这个库服务器侧, 在一个节点. js 进程中 。 一个很好的例子,见快递包装: 特快邮袋-复制-流。 。 。 .
大楼
npm install
npm run build
您的插件现在位于 dist/pouchdb.mypluginname.js 财务报告和审定财务报表 dist/pouchdb.mypluginname.min.js 并准备分发.
测试
在节点
这将使用 LevelDB 运行节点测试 :
npm test
您也可以使用 :
npm run coverage
如果您不喜欢覆盖结果, 将值从 100 更改为其它 package.json,或添加 /*istanbul ignore */ 评论.
如果你在全球安装了Mocha,可以使用:
TEST_DB=local mocha --reporter spec --grep search_phrase
这个 TEST_DB 环境变量指定 PouchDB 应使用的数据库(见 package.json) (中文(简体) ).
在浏览器中
运行 npm run dev 然后指向您最喜欢的浏览器 http://127.0.0.1:8001/test/index.html (中文(简体) )。 。 。 .
查询参数 ?grep=mysearch 将搜索匹配的测试 mysearch。 。 。 .
自动浏览器测试
你可以运行例如.
CLIENT=selenium:firefox npm test
CLIENT=selenium:phantomjs npm test
这将自动运行测试,完成后进程会以0或1退出. Firefox使用索引DB,而PhantomJS使用WebSQL.