如何在 Phoenix Framework 中获取频道推送以在服务器上接收消息
How do I get a channel push to receive a message on the server in Phoenix Framework
我目前正在学习 Phoenix Framework,但在我的频道推送中获取 handle_in 方法匹配时遇到了一些问题。
我的javascript(技术上是打字稿)看起来像这样:
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
有谁知道为什么我的频道推送不匹配?
您是否在服务器端设置了套接字和通道逻辑?另外 - 您使用的是什么版本的 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
那么你应该有一个如下所示的频道模块:
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
您可以在官方指南上阅读有关频道的更多信息:http://www.phoenixframework.org/v0.16.0/docs/channels
同样在 0.16.0 中,您的 JavaScript socket.chan
已重命名为 socket.channel
您可以在 Upgrade Guide
中阅读相关内容
我刚刚弄明白了。事实证明我没有在 javascript 中正确初始化套接字。在 js 中设置记录器对发现问题很有帮助:
this.socket.logger = (kind, msg, data) => { console.log(`${kind}: ${msg}`, data) };
this.socket.connect({ user_id: "123" })
也感谢你让我知道 16.0 已经出来了:)
我目前正在学习 Phoenix Framework,但在我的频道推送中获取 handle_in 方法匹配时遇到了一些问题。
我的javascript(技术上是打字稿)看起来像这样:
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
有谁知道为什么我的频道推送不匹配?
您是否在服务器端设置了套接字和通道逻辑?另外 - 您使用的是什么版本的 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
那么你应该有一个如下所示的频道模块:
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
您可以在官方指南上阅读有关频道的更多信息:http://www.phoenixframework.org/v0.16.0/docs/channels
同样在 0.16.0 中,您的 JavaScript socket.chan
已重命名为 socket.channel
您可以在 Upgrade Guide
我刚刚弄明白了。事实证明我没有在 javascript 中正确初始化套接字。在 js 中设置记录器对发现问题很有帮助:
this.socket.logger = (kind, msg, data) => { console.log(`${kind}: ${msg}`, data) };
this.socket.connect({ user_id: "123" })
也感谢你让我知道 16.0 已经出来了:)