【问题标题】:Synchronising data with Firestore on users connected via Web在通过 Web 连接的用户上与 Firestore 同步数据
【发布时间】:2019-10-31 16:54:22
【问题描述】:

我的设置:

通过 WEB 连接到 Firebase 的用户。

我试图找出一种方法让用户知道数据库文档已被编辑。我如何做到这一点?

我正在尝试构建一个匹配系统,但我不确定如何利用 Cloud Functions 和 Firestore 来实现这一目标。

用户 A 开始匹配,发现没有任何玩家可用的文档,因此他们首先在“matches”集合中创建一个文档,该文档共有 1 个玩家,这是通过事务发生的,以避免任何并发问题(一个单独的问题)。然后用户 A 等待另一个用户加入。

用户 B 尝试进行 matchmake 并在“matches”集合中找到一个文档,并且该文档有足够的空间(最多 2 个玩家),因此用户 B 可以加入,HTTP 请求中的响应向用户 B 发送一个带有文档 ID 的响应以及房间中的另一个用户 ID。

我的问题是我不知道如何通知用户 A 加入房间的新用户。

在此期间,我无法使用 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);
  })
}```

【问题讨论】:

  • 用户通过 web SDK 中的 websockets 连接到 firebase 是否正确?这不能用来和用户交流吗?

标签: firebase web firebase-realtime-database google-cloud-firestore google-cloud-functions


【解决方案1】:

您不需要为此使用云函数,只需收听一个文档或集合中的多个文档。

请参阅 Firestore 客户端 SDK 的 documentation,其中解释了如何设置此类侦听器,以及如何在前端接收文档快照的更新(一个文档)或一个新的查询快照(文档集合)。

【讨论】:

  • 谢谢你成功了,我不习惯在客户端对数据库文档做任何事情,所以我没想到这是一个可行的方法,但效果很好!
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2020-04-16
相关资源
最近更新 更多