Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 使用多个数据库实例在多个CouchDB节点之间共享数据_Angular_Ionic Framework_Synchronization_Couchdb_Pouchdb - Fatal编程技术网

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

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地址。此外,所有节点都彼此隔离 示例场景

对于一个不可能使用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”的服务来处理同步:

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地址,则最好在每次复制之前删除该检查点。有关详细信息,请参阅。