Angular 使用多个数据库实例在多个CouchDB节点之间共享数据
对于一个不可能使用internet和传统WLAN网络的用例,我尝试使用多个智能手机在节点之间共享数据。我想通过使用PockDB和CouchDB的同步功能来实现这一点。节点(raspberry pi)生成唯一的数据并将其存储在CouchDB数据库中。智能手机使用Angular/Ionic 4应用程序来实现PockDB 即使不可能在节点之间创建WLAN网络,也可以使用WiFi将智能手机连接到节点:所有节点都创建WiFi热点。它们都具有相同的SSID和静态IP地址。此外,所有节点都彼此隔离 示例场景 起初,智能手机的数据包是空的。然后,智能手机连接到节点1的热点,让它们执行双向同步。因此,智能手机现在的数据库中有节点1的数据。节点1的CouchDB不会获得额外数据,因为智能手机的pockDB是空的 接下来,智能手机1连接到节点2并进行同步。智能手机现在应该在其数据库中包含节点1和节点2的数据。节点2的CouchDB现在应该有自己的数据和节点1的数据,因为智能手机在它的数据库中有这些数据 问题 出于某种原因,智能手机的PockDB只是从节点“拉”数据,而不是“推”其他节点的数据。因此,在上面的示例中,智能手机以节点1和节点2的数据结束,但节点2只有自己的数据。节点1的数据不会传输到节点2。我没有看到任何错误消息,我也不知道这个问题的原因是什么 代码 我使用的代码是基于blogpost的。我正在使用一个名为“PockService”的服务来处理同步:Angular 使用多个数据库实例在多个CouchDB节点之间共享数据,angular,ionic-framework,synchronization,couchdb,pouchdb,Angular,Ionic Framework,Synchronization,Couchdb,Pouchdb,对于一个不可能使用internet和传统WLAN网络的用例,我尝试使用多个智能手机在节点之间共享数据。我想通过使用PockDB和CouchDB的同步功能来实现这一点。节点(raspberry pi)生成唯一的数据并将其存储在CouchDB数据库中。智能手机使用Angular/Ionic 4应用程序来实现PockDB 即使不可能在节点之间创建WLAN网络,也可以使用WiFi将智能手机连接到节点:所有节点都创建WiFi热点。它们都具有相同的SSID和静态IP地址。此外,所有节点都彼此隔离 示例场景
export class PouchService {
data: any;
db: any;
remote: any;
constructor(public app: ApplicationRef, public http: HttpClient) {
this.db = new PouchDB("eventory");
this.remote = "http://192.168.4.1:5984/eventorydb";
let options = {
live: true,
retry: true,
continuous: true,
auto_compaction: true,
};
this.db.sync(this.remote, options);
因此,智能手机会创建一个名为“eventory”的本地数据库,远程数据库名为“eventorydb”,这对所有节点都是一样的,以确保智能手机能够自动连接到数据库。以下代码用于执行同步:
getProducts() {
if (this.data) {
return Promise.resolve(this.data);
}
return new Promise(resolve => {
this.db
.allDocs({
include_docs: true
})
.then(result => {
this.data = [];
let docs = result.rows.map(row => {
this.data.push(row.doc);
});
resolve(this.data);
this.db
.changes({ live: true, since: "now", include_docs: true })
.on("change", change => {
this.handleChange(change);
});
})
.catch(error => {
console.log(error);
});
});
}
然后找到的更改由以下人员处理:
handleChange(change) {
let changedDoc = null;
let changedIndex = null;
this.data.forEach((doc, index) => {
if (doc._id === change.id) {
changedDoc = doc;
changedIndex = index;
}
});
//A document was deleted
if (change.deleted) {
this.data.splice(changedIndex, 1);
this.app.tick();
} else {
//A document was updated
if (changedDoc) {
this.data[changedIndex] = change.doc;
this.app.tick();
}
//A document was added
else {
this.data.push(change.doc);
this.app.tick();
}
}
}
如果有什么不清楚的,请让我知道,我会提供更多的信息 CouchDB复制协议在本地存储复制快照,以便以后可以继续。该快照(部分)基于远程服务器的IP地址/主机名。如果在每个节点上使用相同的IP地址,则会混淆该机制。如果不能使用不同的IP地址,则最好在每次复制之前删除该检查点。有关详细信息,请参阅。