【发布时间】: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