Синхронизация данных с Firestore для пользователей, подключенных через Интернет - PullRequest
1 голос
/ 18 июня 2019

Мои настройки:

Пользователи, подключенные к Firebase через WEB.

Я пытаюсь найти способ сообщить пользователю, что документ базы данных был отредактирован. Как мне этого добиться?

Я пытаюсь создать систему организации матчей, но я не уверен, как использовать Cloud Functions и Firestore для достижения этой цели.

Пользователь A начинает поиск совпадений и обнаруживает, что ни у одного из игроков нет доступных документов, поэтому он начинает с создания документа в коллекции «совпадений», и в этом документе всего 1 игрок, это происходит посредством транзакции во избежание проблем параллелизма (отдельная проблема). Затем пользователь A ожидает присоединения другого пользователя.

Пользователь B пытается найти совпадения и находит документ в коллекции «совпадений», и в этом документе достаточно места (максимум 2 игрока), чтобы пользователь B мог присоединиться, и ответ в HTTP-запросе отправляет ответ пользователю B с идентификатором документа. и другой идентификатор пользователя в комнате.

Моя проблема в том, что я не знаю, как уведомить пользователя А о новом пользователе, который присоединился к комнате.

Между тем, я не могу использовать Web Push, так как он не поддерживается в iOS и других версиях браузера.

Я пробовал Web Push, он не работает. И я использую Firebase Web SDK.

  db.runTransaction(async t=>{
    // console.log('S T A R T - T R A N S A C T I O N ', vUser);
    const dref = await db.collection('matches').where('totalPlayers', '==', 1).get();
    if (dref.size > 0) {
    const d = await t.get(dref.docs[0].ref);
    // console.log(d.data());
      let doc = d;
      // console.log('G O T - D O C  for ', vUser);
      let data = doc.data();
      if (data.totalPlayers + 1 > 2) {
        return Promise.reject('too many players');
      }
      else {
        data.totalPlayers+=1;
        data.players.push(vUser);
        // console.log({_id:doc.id});
        let returnData = {_id:doc.id, data:data};
        t.update(doc.ref, data);
        return Promise.resolve(returnData);
      }
    }
    else {
      let docData = {
        'players': [vUser], totalPlayers: 1,
          created: admin.firestore.Timestamp.now()._seconds
      };
      let matchRef =  db.collection('matches').doc();
      t.set(matchRef, docData);
return Promise.resolve(docData);
      });

    }
  }).then((result)=>{
    console.log('transaction S U C C E S S ', vUser, result);
    response.status(200).send(result);
  }).catch(err=>{
    console.log('transaction F A I L ', vUser, err);
  })
}```

1 Ответ

0 голосов
/ 18 июня 2019

Для этого вам не нужно использовать облачную функцию, просто прослушивайте либо один документ, либо несколько документов в коллекции.

См. Документацию для SDK Firestore Clients, в которой объясняется, как установить таких слушателей и как во внешнем интерфейсе пользователи получат обновление снимка документа (один документ) или новый снимок запроса (коллекция документов).

...