对于无法使用Internet和传统WLAN网络的用例,我试图通过使用多个智能手机在节点之间共享数据。我想通过使用PouchDB和CouchDB的同步功能来做到这一点。节点(树莓派)生成唯一数据并将其存储在其CouchDB数据库中。智能手机使用实现PouchDB的Angular / Ionic 4应用程序。
即使无法在节点之间创建WLAN网络,也可以 使用WiFi将智能手机连接到节点:所有节点都创建一个WiFi热点。它们都具有相同的SSID和静态IP地址。此外,节点都相互隔离。
示例场景
首先,智能手机的PouchDB为空。然后,智能手机连接到节点1的热点,这使它们可以执行双向同步。因此,智能手机现在在其PouchDB中具有节点1的数据。节点1的CouchDB无法获取其他数据,因为智能手机的PouchDB为空。
接下来,智能手机1连接到节点2并进行同步。现在,智能手机的PouchDB中应该具有节点1和节点2的数据。现在,节点2的CouchDB应该具有其自己的节点1的数据和数据,因为智能手机将其包含在其PouchDB中。
问题
由于某种原因,智能手机的PouchDB只是从节点“拉”数据,而不是“推”其他节点的数据。因此,在上面的示例中,智能手机最终获得了节点1和2的数据,但是节点2仅拥有自己的数据。节点1的数据未传输到节点2。我没有看到任何错误消息,而且我真的不知道导致此问题的原因。
代码
我使用的代码基于this博客文章。我正在使用名为“ PouchService”的服务来处理同步:
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”的本地PouchDB,远程数据库称为“ 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();
}
}
}
如果不清楚,请让我知道,我将提供更多信息!