我有两个CouchDB实例,每个实例都复制另一个实例。这里的问题是每次创建新数据库时,我需要监视新创建的数据库和POST以创建用于复制的_replicator文档。
有没有办法轻松地将整个数据库从一个数据库复制到另一个数据库而不会触发插入_replicator文档?
答案 0 :(得分:1)
不是我知道的。我有类似的东西。我写了一个小节点应用程序来收听更改通知。如果我创建一个新数据库,则更改通知会通知我的节点应用程序,然后节点应用程序会创建其他所有内容,例如复制。
答案 1 :(得分:0)
好的,这是我的代码片段,对德国评论感到抱歉:)
/**
* In die Log-Datei der CouchDB einen neuen
* Eintrag hinzufügen.
*
* @param msg
*
* @author Robert Gregat
*/
var log = function(msg) {
console.log(JSON.stringify(["log", msg]));
};
/**
* Dies ist eine Funktion die aus dem nano Node Module entnommen
wurde.
*
* @author https://github.com/dscape/nano
*/
function _serializeAsUrl(db) {
if (typeof db === 'object' && db.config && db.config.url && db.config.db) {
return urlResolveFix(db.config.url, encodeURIComponent(db.config.db));
} else {
return db;
}
}
// CouchDB stellt eine API bereit die über stdin Befehle entgegen
nimmt.
var stdin = process.openStdin();
// Das Encoding auf utf8 einstellen.
stdin.setEncoding('utf8');
// Auswerten von empfangenen Daten der CouchDB. Wenn eine neue
Datenbank angelegt wurde, enthält das
// JSON Objekt den value created. Tritt dieser Fall ein, wird
automatisch aus der design und custom db
// alle Dokumente in die neue Datenbank repliziert.
stdin.on('data', function(d) {
// Parsen des Ergebnis
if (d !== null) {
parsedData.push(JSON.parse(d));
}
});
/**
* Die Applikation muss in einer Endlosschleife laufen.
*
* @author Robert Gregat
*/
var checker = function() {
for (var index in parsedData) {
if (parsed.type === "created" && parsed.db !== "design" && parsed.db !== "custom") {
// do stuff
}
}
parsedData = [];
setTimeout(checker, 1000);
}
// Endlosschleife starten.
checker();
函数日志帮助我做一些记录到couchdb.log文件。
函数_serializeAsUrl是来自节点模块nano的函数,用于进行一些格式化。
使用process.openStdin(),我开始侦听来自couchdb的发出事件。
使用stdin.on()我可以捕获发出的事件。
函数检查器接收收集的事件,并根据传递的信息执行我想要的任务(此函数必须处于无限循环中)。
在couchdb配置中,您必须添加以下内容:
[update_notification]
[name] = nodejs [path/to/your/node_application]
有关详细信息,请访问以下网站:http://docs.couchdb.org/en/1.6.1/config/externals.html