我正在尝试设置一个以无服务器方式使用WebSockets的简单聊天应用。我正在使用Azure的WebPubSub服务,代码托管在Azure Function应用中。
我正在使用javascript,并在这个示例应用程序的基础上我的代码:https://github.com/Azure/azure-webpubsub/tree/main/samples/functions/js/simplechat那个链接有所有的后端代码,所有的触发器和绑定都和我的一样。
我可以在以下事件上运行代码:
- 连接
- 连通的
- 讯息
- 断开
对于connect事件,我有以下代码:(连接/索引. js)
context.bindings.actions.push({
"actionName": "addUserToGroup",
"userId": `${context.bindingData.connectionContext.userId}`,
"group": "group1"
});
它基本上告诉webPubSub将用户添加到一个组,在本例中称为“group 1”。
对于我的应用程序来说,当我从客户端向套接字发送消息时,我需要知道我是否是唯一连接到那个组的人。到目前为止,我在文档中没有找到任何关于这个问题的信息。
在示例应用中,每当出现消息时,就会运行以下代码(message/index.js)
var response = {
....
"states": {
"counterState": {
counter: msgCounter,
}
}
};
return response;
每当有消息时,它们都会递增msgCounter变量,并将其保存到连接状态。当connected事件触发时,我尝试递增变量,但似乎无法在该特定函数中设置状态。然后,我尝试在message事件上执行该操作,但似乎该状态不是所有连接的全局状态(即,它特定于唯一连接)
在这方面的任何帮助都将非常感激。谢谢
1条答案
按热度按时间j8ag8udp1#
没有办法检查 * 我是否是唯一连接到该组的人 *。有一个API可以使用groupExists检查 * 该组中是否有任何连接 *。
但是,即使有了这个API,检查和后续操作也不是原子的,因此即使
groupExists
返回no
也不能保证您是第一个连接的对等体。(例如由于网络问题),因此即使连接A是第一个连接的对等体,也有可能当连接B连接时,连接A断开,从而导致连接B相信它是此时第一个连接的对等体。对于您的场景“第一个连接的对等体必须等待offers连接到。其他对等体发送offers”,这个对等逻辑听起来更好地由应用程序端使用一些全局存储来维护,例如,在Azure表存储中,存在一个方法createEntity,其仅在实体不存在时成功。以下代码
getOrAddFirstPeer
显示了如何仅在第一个对等点不存在时设置它,以及如何使用TableClient在第一个对等点存在时获取它: