Использование нескольких экземпляров PouchDB для обмена данными между несколькими узлами CouchDB - PullRequest
0 голосов
/ 09 февраля 2020

В случае использования, в котором inte rnet и традиционная сеть WLAN невозможны, я пытаюсь обмениваться данными между узлами с помощью нескольких смартфонов. Я хочу сделать это с помощью функций синхронизации PouchDB и CouchDB. Узлы (raspberry pi's) генерируют уникальные данные и сохраняют их в своей базе данных CouchDB. На смартфонах используется приложение Angular / Ioni c 4, которое реализует PouchDB.

Несмотря на то, что невозможно создать сеть WLAN между узлами, - это возможность подключения смартфонов к узлам с помощью WiFi: все узлы создают точку доступа WiFi. Все они имеют одинаковый SSID и IP-адрес. Кроме того, все узлы изолированы друг от друга.

Пример сценария

Сначала PouchDB смартфона пуста. Затем смартфон подключается к точке доступа узла 1, что позволяет им выполнять двустороннюю синхронизацию c. Таким образом, смартфон теперь содержит данные узла 1 в своем PouchDB. CouchDB узла 1 не получает дополнительные данные, потому что PouchDB смартфона была пуста.

Далее смартфон 1 подключается к узлу 2 и синхронизируется. Смартфон должен теперь иметь данные узла 1 и узла 2 в своем PouchDB. CouchDB узла 2 теперь должна иметь свои собственные данные и данных узла 1, потому что смартфон был в своем PouchDB.

Проблема

По какой-то причине PouchDB смартфона только «вытягивает» данные из узлов, но не «выталкивает» данные, которые имеются у других узлов. Таким образом, в приведенном выше примере смартфон заканчивается данными узлов 1 и 2, но узел 2 имеет только свои собственные данные. Данные узла 1 не передаются на узел 2. Я не вижу никаких сообщений об ошибках, и я действительно не знаю, что может быть причиной этой проблемы.

Код

Код, который я использую, основан на этом блоге. Я использую сервис с именем '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);

Таким образом, смартфон создает локальную PouchDB с именем "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();
      }
    }
  }

Если что-то неясно, пожалуйста, дайте мне знать, и я сообщу предоставить больше информации!

...