问题
I want to pattern match on the value of a key in a map
def handle_in("new_message", payload, socket) do
case payload.message do
"hello" -> broadcast! socket, "new_message", payload
end
{:noreply, socket}
end
[error] GenServer #PID<0.378.0> terminating
** (KeyError) key :message not found in: %{"message" => "hello", "name" => "x"}
(chatroom) web/channels/lobby_channel.ex:9: 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
when I send the payload of %{"message" => "hello", "name" => "x"}
, that error happens, or for any other message.
回答1:
Your key here is "message"
not :message
. Use: payload["message"]
def handle_in("new_message", payload, socket) do
case payload["message"] do
"hello" -> broadcast! socket, "new_message", payload
end
{:noreply, socket}
end
You can also do this:
def handle_in("new_message", %{"message" => message}, socket) do
case message do
# ...
end
来源:https://stackoverflow.com/questions/40118252/pattern-match-on-value-of-maps-key-in-elixir