使用多个PouchDB实例在多个CouchDB节点之间共享数据

时间:2020-02-09 17:54:31

标签: angular ionic-framework synchronization couchdb pouchdb

对于无法使用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();
      }
    }
  }

如果不清楚,请让我知道,我将提供更多信息!

0 个答案:

没有答案
相关问题