gpt4 book ai didi

elixir - 如何在Phoenix框架中进行 channel 推送以接收服务器上的消息

转载 作者:行者123 更新时间:2023-12-02 09:45:49 24 4
gpt4 key购买 nike

我目前正在学习 Phoenix 框架,在获取与我的 channel 推送相匹配的 handle_in 方法时遇到了一些麻烦。

我的 JavaScript(技术上它是 typescript )看起来像这样:

let channel = this.socket.chan('rooms:lobby', {});

channel.join().receive('ok', channel => {
console.log(`Joined the channel`);
});

// channel.on("feed", payload => {
// console.log(`Message from server: ${payload.list}`);
// });

channel.push("new:msg", 'test message');

服务器端定义如下所示:

def handle_in("new:msg", msg, socket) do
IO.puts "Message from the client: #{msg}"

{:noreply,socket }
end

有人知道为什么我的 channel 推送不匹配吗?

最佳答案

您是否在服务器端设置了套接字和 channel 逻辑?另外 - 您使用的是哪个版本的 Phoenix?在 > 0.15.0 的版本中,您应该在 lib/app/endpoint.ex

中有类似的内容
# lib/hello_phoenix/endpoint.ex
defmodule HelloPhoenix.Endpoint do
use Phoenix.Endpoint

socket "/socket", HelloPhoenix.UserSocket
...
end

然后是socket模块:

# web/channels/user_socket.ex
defmodule HelloPhoenix.UserSocket do
use Phoenix.Socket

channel "rooms:*", HelloPhoenix.RoomChannel
...
end

那么您应该有一个如下所示的 channel 模块:

defmodule HelloPhoenix.RoomChannel do
use Phoenix.Channel

def join("rooms:lobby", auth_msg, socket) do
{:ok, socket}
end
def join("rooms:" <> _private_room_id, _auth_msg, socket) do
{:error, %{reason: "unauthorized"}}
end

def handle_in("new_msg", %{"body" => body}, socket) do
broadcast! socket, "new_msg", %{body: body}
{:noreply, socket}
end

def handle_out("new_msg", payload, socket) do
push socket, "new_msg", payload
{:noreply, socket}
end
end

您可以在官方指南上阅读有关 channel 的更多信息:http://www.phoenixframework.org/v0.16.0/docs/channels

此外,在 0.16.0 中,JavaScript socket.chan 已重命名为 socket.channel 您可以在 Upgrade Guide 中阅读有关此内容的信息。

关于elixir - 如何在Phoenix框架中进行 channel 推送以接收服务器上的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com