0

我希望修改 Chris McCord 的聊天示例以添加其他功能。基本上,我希望 JavaScript 客户端能够使用 JSON 访问许多便利功能,例如getUsersInRoom(room_id)is_online(user_id)等。

但我不知道该怎么做。Channels 上的文档说:

每个 Channel 将实现这四个回调函数中的每一个的一个或多个子句 - join/3、terminate/2、handle_in/3 和 handle_out/3。

这是否意味着这些是唯一允许的功能?我认为我需要的是一个套接字 API,但我以前从未使用过套接字,希望能得到一些帮助。此外,该示例似乎适用于将字符串作为参数传递的直接函数调用,但我需要我的聊天系统才能使用 JSON。我完全不确定我该如何做到这一点。

4

1 回答 1

0

你的问题是两部分的,所以我会给你一个两部分的答案。此外,您的问题是一个更通用的设计问题,而不是特定于 Elixir 或 Phoenix,所以我也会保留一般的答案。

此外,该示例似乎适用于将字符串作为参数传递的直接函数调用,但我需要我的聊天系统才能使用 JSON。我完全不确定如何做到这一点。

没有通过网络传递 JSON 类型这样的事情。您将 JSON 编组(字符串化)成一个字符串,发送该字符串,然后在另一端将其解组(解析)回 JSON。因此,如果您想将消息构造为 JSON,那非常酷,只需记住在每个接收点编组/解组即可。

(释义)便利功能

最简单的方法是使这些函数成为实际的消息类型,然后使用其中一个handle_inhandle_out函数来选择该类型,收集并返回数据。例如,让一条消息current_online_users返回一个句柄列表。您可以过滤该列表客户端以检查是否存在。一些 websocket 实现也有存在钩子,但我对 Phoenix 中的那些不熟悉。

另一种方法是在 JSON 消息结构中构建。在顶层,您可以返回 Phoenix 看到的房间中的当前用户数。

希望这可以帮助。

于 2016-09-28T02:49:46.857 回答