如何在Phoenix Framework中获取通道推送以在服务器上接收消息

时间:2015-08-07 05:42:09

标签: elixir 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看起来像这样:

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

  {:noreply,socket  }
end

有没有人知道为什么我的频道推送不匹配?

2 个答案:

答案 0 :(得分:3)

您是否在服务器端设置了套接字和通道逻辑?另外 - 您使用的是什么版本的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

然后是套接字模块:

# 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

同样在您的JavaScript {0.1}中的0.16.0已重命名为socket.chan您可以在Upgrade Guide

中阅读此内容

答案 1 :(得分:2)

我只想出了这个。事实证明我没有在我的javascript中正确初始化套接字。在js中设置记录器对于找到问题非常有帮助:

this.socket.logger = (kind, msg, data) => { console.log(`${kind}: ${msg}`, data) };
this.socket.connect({ user_id: "123" })

还要感谢让我知道16.0已经出局了:)