向频道添加自定义功能

Adding custom functions to channels

我想修改 Chris McCord 的 chat example 以添加额外的功能。基本上,我希望 JavaScript 客户端可以使用 JSON.

访问许多便利功能,例如 getUsersInRoom(room_id)is_online(user_id) 等。

但我不确定该怎么做。频道上的文档说:

Each Channel will implement one or more clauses of each of these four callback functions - join/3, terminate/2, handle_in/3, and handle_out/3.

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

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

Also, the example seems to work on direct function calls with strings passed as arguments, but I need my chatting system to use JSON. I'm not at all sure how I can accomplish this.

没有通过网络传递 JSON 类型这样的事情。您将 JSON 编组(stringify)为一个字符串,发送该字符串,然后在另一侧将其解编(解析)回 JSON 。所以,如果你想将你的消息结构化为 JSON,那太酷了,只记得在每个接收点 marshal/unmarshal。

(paraphrased) Convenience functions

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

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

希望对您有所帮助。