我试图在牛仔websocket处理程序中使用jiffy解析它时捕获无效的json。如果json有效/无效,我想将适当的消息转发给websocket_info
,它将回复客户端。这是我的代码。
websocket_handle({text, Msg}, Req, State) ->
lager:info("Got message ~p",[Msg]),
try jiffy:decode(Msg) of
{[{A,B}]}->{{[{A,B}]},Req,State};
_->{{invalid,Msg},Req,State}
catch
_:_->
{{invalid,Msg},Req,State}
end;
websocket_handle(_Data, Req, State) ->
{ok, Req, State}.
websocket_info({[{A,B}]},Req,State) ->
{reply,{text,jiffy:encode({registered,B})},Req,State};
websocket_info({invalid,Msg},Req,State)->
{reply,{text,jiffy:encode({error,<<"invalid json">>})},Req,State};
这会导致运行时异常。
12:07:48.406 [错误] Ranch listener http有连接过程&lt; 0.523.0&gt;退出原因:{{try_clause,{{[{&lt;&lt;“register”&gt;&gt;,&lt;&lt;“my-channel”&gt;&gt;}]},{http_req,#Port&lt; 0.1337&gt; ,ranch_tcp,存活,和LT; 0.523.0&GT;,&LT;&LT; “GET” &GT;&GT;, 'HTTP / 1.1',{{127,0,0,1},34869},&LT;&LT;“127.0 .0.1 “&GT;&GT;,未定义,3000,&LT;&LT;”/网页套接字/ “&GT;&GT;,未定义&LT;&LT;&GT;&GT;,未定义[],[{&LT;&LT;” 升级“&GT;&GT;,&LT;&LT;” 的WebSocket “&GT;&GT;},{&LT;&LT;” 连接 “&GT;&GT;,&LT;&LT;” 升级“&GT;&GT;},{&LT;&LT; “宿主” &GT;&GT;,&LT;&LT; “127.0.0.1:3000” &GT;&GT;},{&LT;&LT; “原点” &GT;&GT;,&LT;&LT; “
http://localhost:4000
” &GT ;&GT;},{&LT;&LT; “编译” &GT;&GT;,&LT;&LT; “无缓存” &GT;&GT;},{&LT;&LT; “缓存控制” &GT;&GT;,&LT; &LT; “无缓存” &GT;&GT;},{&LT;&LT; “仲WebSocket的密钥” &GT;&GT;,&LT;&LT; “ueSRxsIc4wM7KdGnyhJOhw ==” &GT;&GT;},{&LT;&LT; “仲WebSocket的版本” &GT;&GT;,&LT;&LT; “13” &GT;&GT;},{&LT;&LT; “仲WebSocket的扩展” &GT;&GT;,&LT;&LT;“X-webkit的-deflate-frame“&gt;&gt;},{&lt;&lt;”user-agent“&gt;&gt;,&lt;&lt;”Mozilla / 5.0(X11; Linux i686(x86_64))AppleWebKit / 537.36(KHTML,l ike Gecko)Chrome / 30.0.1599.114 Safari / 537.36“&gt;&gt;}],[{&lt;&lt;”sec-websocket-extensions“&gt;&gt;,[{&lt;&lt;”x-webkit-deflate-帧 “&GT;&GT;,[]}]},{&LT;&LT;” 升级 “&GT;&GT;,并[d&LT;” 的WebSocket “&GT;&GT;]},{&LT;&LT;” 连接“&GT ;&GT;,并[d&LT; “升级” &GT;&GT;]}],未定义,[{websocket_compress,FALSE},{websocket_version,13}],等待,未定义&LT;&LT;&GT;&GT;,假,完成,[],&LT;&LT;&GT;&GT;,未定义},undefined_state}},[{cowboy_websocket,handler_call,7,[{文件, “SRC / cowboy_websocket.erl”},{线,598}]} {cowboy_protocol,执行,如图4所示,[{文件, “SRC / cowboy_protocol.erl”},{线,529}]}]}
那我该怎么做呢?
答案 0 :(得分:1)
回复应从websocket_handle
返回:
websocket_handle({text, Msg}, Req, State) ->
lager:info("Got message ~p", [Msg]),
try jiffy:decode(Msg) of
{[{A, B}]}->
{reply, {text, jiffy:encode({[{registered,B}]})}, Req, State};
_ ->
{reply, {text, jiffy:encode({[{error,<<"invalid json">>}]})}, Req, State}
catch
_:_ ->
{reply, {text, jiffy:encode({[{error,<<"invalid json">>}]})}, Req, State};
end;
websocket_handle(_Data, Req, State) ->
{ok, Req, State}.
websocket_info(_Info, Req, State) ->
{ok, Req, State}.