2017-03-03 7 views
0

websocket着信メッセージを前処理しようとしています。 lobby_channel.exファイルで私が持っている:"Elixir + Phoenix" Websocketメッセージをフィルタリングする

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 

モデルファイルは、検証機能が含まれています

... 
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 
... 

..the最後のものは私のカスタム検証関数であり、私はそれがエラーなしで作業することはできません。私が手出力:

--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>} 

私は理解しているように、物事を論理的に正しい方法に移行しつつありますが、メッセージは正しいデータが含まれていますが、どのように私は、エラーを修正できますか?私は何が欠けていますか?

+0

'[]'を 'changeset'に変更してみてください。 – Dogbert

+0

@Dogbert、同じエラーです。 "00"メッセージとその他すべて – Alexey

+0

'web/channels/lobby_channel.ex'の完全な内容を投稿できますか? – Dogbert

答えて

0

コード内の3個のエラーがあります。

  1. is_move_allowedは常にチェンジを返す必要があります。あなたはもう一度[]を返しています。

  2. add_errorの二番目の引数は、原子

  3. changeset.errors[:message]がタプルであるので、あなたは文字列でそれを連結する<>を使用することはできませんする必要があります。 IO.inspectは、どんな値でも印刷できるので、より良い選択肢です。だから、

、変更:

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 

と変更:

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 

IO.puts "-----" <> changeset.errors[:message] 

へ:

IO.inspect changeset.errors[:message] 
# or IO.inspect changeset.errors 
関連する問題