Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;长生不老药&x2B;凤凰城“;过滤websocket消息_Websocket_Elixir_Phoenix Framework - Fatal编程技术网

&引用;长生不老药&x2B;凤凰城“;过滤websocket消息

&引用;长生不老药&x2B;凤凰城“;过滤websocket消息,websocket,elixir,phoenix-framework,Websocket,Elixir,Phoenix Framework,我尝试预处理websocket传入的消息。在lobble\u channel.ex文件中,我有: defmodule Chatroom.LobbyChannel do use Phoenix.Channel def join("room:lobby", _payload, socket) do {:ok, socket} end def join("room:" <> _private_room_id, _params, _socket) do {:

我尝试预处理websocket传入的消息。在
lobble\u channel.ex
文件中,我有:

defmodule Chatroom.LobbyChannel do
  use Phoenix.Channel

  def join("room:lobby", _payload, socket) do
    {:ok, socket}
  end
  def join("room:" <> _private_room_id, _params, _socket) do
    {:error, %{reason: "unauthorized"}}
  end

  def handle_in("new_move", payload, socket) do
    changeset = Chatroom.Move.changeset(%Chatroom.Move{}, payload)

    if changeset.valid? do
      broadcast! socket, "new_move", payload
      {:noreply, socket}
    else
      IO.puts "-----" <> changeset.errors[:message]
      push socket, "error", %{msg: "Invalid move"}
      {:noreply, socket}
    end
  end

  #intercept ["new_move"]
  #def handle_out("new_move", payload, socket) do
  #  IO.puts payload["name"] <> "=======" <> payload["message"]
  #  push socket, "new_move", payload
  #  {:noreply, socket}
  #end
end
defmodule Chatroom.LobbyChannel do
使用凤凰频道
def join(“房间:大厅”、_有效载荷、插座)do
{:好的,socket}
结束
def join(“房间:”\u private\u room\u id,\u params,\u socket)do
{:错误,%{原因:“未经授权”}
结束
def手柄进入(“新移动”,有效载荷,插座)do
changeset=Chatroom.Move.changeset(%Chatroom.Move{},有效负载)
如果changeset.valid有效?做
广播!插座,“新移动”,有效载荷
{:noreply,socket}
其他的
IO.puts“----”变更集。错误[:消息]
推送套接字,“错误”%{msg:“无效移动”}
{:noreply,socket}
结束
结束
#拦截[“新移动”]
#def手柄移出(“新移动”、有效负载、插座)do
#IO.puts有效负载[“名称”]==========“有效负载[“消息”]
#推动插座,“新移动”,有效载荷
#{:noreply,socket}
#结束
结束
模型文件包含验证函数:

...
def changeset(struct, params \\ %{}) do
  struct
  |> cast(params, [:name, :message])
  |> validate_required([:name, :message])
  |> validate_length(:name, min: 1)
  |> validate_length(:message, is: 2)
  |> is_move_allowed(params)
end

defp is_move_allowed(changeset, params) do
  IO.puts "--zz---" <> params["message"]

  if params["message"] == "00" do
    IO.puts "--yy---" <> params["message"]
    add_error(changeset, params["message"], "'message' cannot be '00'")
  else
    IO.puts "--xx---" <> params["message"]
    []
  end
end
...
。。。
def变更集(结构,参数\\%{})do
结构
|>强制转换(参数,[:名称,:消息])
|>验证\u必需([:名称,:消息])
|>验证长度(:名称,最小值:1)
|>验证长度(:消息,is:2)
|>是否允许移动(参数)
结束
defp是否允许移动(变更集、参数)do
IO.puts“-zz--”参数[“消息”]
如果参数[“消息”]=“00”do
IO.puts”-yy--“参数[“消息”]
添加错误(变更集,参数[“消息”],“消息”不能为“00”)
其他的
IO.puts“-xx--”参数[“消息”]
[]
结束
结束
...
…最后一个是我的自定义验证函数,我无法使它正常工作而没有错误。我得到的输出:

--zz---00
--yy---00
[error] GenServer #PID<0.445.0> terminating
** (ArgumentError) argument error
    :erlang.byte_size(nil)
    (chatroom) web/channels/lobby_channel.ex:18: Chatroom.LobbyChannel.handle_in/3
    (phoenix) lib/phoenix/channel/server.ex:226: anonymous fn/4 in Phoenix.Channel.Server.handle_info/2
    (stdlib) gen_server.erl:601: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:667: :gen_server.handle_msg/5
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Last message: %Phoenix.Socket.Message{event: "new_move", payload: %{"message" => "00", "name" => "a"}, ref: "2", to
pic: "room:lobby"}
State: %Phoenix.Socket{assigns: %{}, channel: Chatroom.LobbyChannel, channel_pid: #PID<0.445.0>, endpoint: Chatroom
.Endpoint, handler: Chatroom.UserSocket, id: nil, joined: true, pubsub_server: Chatroom.PubSub, ref: nil, serialize
r: Phoenix.Transports.WebSocketSerializer, topic: "room:lobby", transport: Phoenix.Transports.WebSocket, transport_
name: :websocket, transport_pid: #PID<0.439.0>}
--zz--00
--yy--00
[错误]GenServer#PID正在终止
**(ArgumentError)参数错误
:erlang.byte_size(nil)
(聊天室)web/channels/lobby\u channel.ex:18:chatroom.LobbyChannel.handle\u in/3
(phoenix)lib/phoenix/channel/server.ex:226:phoenix.channel.server.handle_info/2中的匿名fn/4
(stdlib)gen_server.erl:601::gen_server.try_dispatch/4
(stdlib)gen_server.erl:667::gen_server.handle_msg/5
(stdlib)proc_lib.erl:247::proc_lib.init_p_do_apply/3
最后一条消息:%Phoenix.Socket.message{event:“new_move”,有效负载:%%{“message”=>“00”,“name”=>“a”},参考:“2”,到
图:“房间:大厅”}
状态:%Phoenix.Socket{Assignments:%{},通道:Chatroom.LobbyChannel,通道\u pid:#pid,端点:Chatroom
.Endpoint,处理程序:Chatroom.UserSocket,id:nil,joined:true,pubsub\u服务器:Chatroom.pubsub,ref:nil,序列化
r:Phoenix.Transports.WebSocketSerializer,主题:“房间:大厅”,传输:Phoenix.Transports.WebSocket,传输_
名称::websocket,传输#pid:#pid}

据我所知,事情正朝着正确的方向发展,从逻辑上讲,消息包含正确的数据,但如何修复错误?我遗漏了什么?

代码中有三个错误:

  • 是否允许移动
    必须始终返回变更集。您将在else中返回
    []

  • add\u error
    的第二个参数应该是atom

  • changeset.errors[:message]
    是一个元组,因此不能使用
    将其与字符串连接起来<代码>IO.inspect是一个更好的选择,因为它可以打印任何值

  • 因此,改变:

    if params["message"] == "00" do
      IO.puts "--yy---" <> params["message"]
      add_error(changeset, params["message"], "'message' cannot be '00'")
    else
      IO.puts "--xx---" <> params["message"]
      []
    end
    

    尝试将else中的
    []
    更改为
    changeset
    @Dogbert,同样的错误。对于“00”消息和所有其他扫描,您可以发布
    web/channels/lobb\u channel.ex的完整内容
    ?啊,尝试
    添加错误(changeset,:message,“'message'不能是'00'”
    @Dogbert,谢谢,第三个错误是
    IO.puts”----“changeset.errors[:message]
    应替换为inspect:
    IO.inspect变更集。错误
    。您可以在主要答案中总结这3个修复,这样我就可以接受了
    if params["message"] == "00" do
      IO.puts "--yy---" <> params["message"]
      add_error(changeset, :message, "'message' cannot be '00'")
    else
      IO.puts "--xx---" <> params["message"]
      changeset
    end
    
    IO.puts "-----" <> changeset.errors[:message]
    
    IO.inspect changeset.errors[:message]
    # or IO.inspect changeset.errors