我的erlang服务器因某种原因在每次请求后都会生成一个case_clause错误。这是我的代码:
的 keychain_no_auth_handler.erl
-module(keychain_no_auth_handler).
-export(
[ init/3,
content_types_accepted/2,
terminate/3,
allowed_methods/2,
handle_request/2
]).
-export([is_registered/1]).
init(_Transport, _Req, []) -> {upgrade, protocol, cowboy_rest}.
terminate(_Reason, _Req, _State) -> ok.
allowed_methods(Req, State) -> {[<<"POST">>], Req, State}.
content_types_accepted(Req, State) -> {[{<<"application/json">>, handle_request}], Req, State}.
handle_request(Req, State) ->
{Action, Req2} = cowboy_req:binding(action, Req),
{Reply, Req3} = case Action of
<<"registered">> -> is_registered(Req2)
end,
{ok, Req4} = cowboy_req:reply(200, [{<<"content-type">>, <<"application/json">>}], Reply, Req3),
{ok, Req4, State}
.
is_registered(Req) ->
{Number, Req2} = cowboy_req:qs_val(<<"number">>, Req),
Reply = backend:is_registered(Number),
{Reply, Req2}
.
is_registered [功能]
is_registered(Number) ->
emysql:prepare(is_registered, <<"SELECT `device`.`id` FROM `device` WHERE `device`.`number`= ?">>),
ResultPacket = emysql:execute(auth_pool, is_registered, [Number]),
ResultType = is_record(ResultPacket, result_packet),
case ResultType of
true ->
Field = emysql_util:as_proplist(ResultPacket),
Id = proplists:get_value(<<"device.id">>, Field),
Registered = Id >= 0,
case Registered of
true ->
Reply = {[{response, registered}]},
jiffy:encode(Reply)
;
false ->
Reply = {[{response, available}]},
jiffy:encode(Reply)
end;
false ->
Reply = {[{response, error}]},
jiffy:encode(Reply)
end
.
服务器回复相应的响应,然后在每次请求后生成case_clause错误:
= ERROR REPORT ==== 2014年2月5日:: 10:32:39 ===过程中的错误&lt; 0.182.0&gt;在节点&#39; keychain @ dnldd&#39;退出值: {{case_clause,{OK,{http_req,#端口&LT; 0.2286&GT;,ranch_tcp,存活,和LT; 0.182.0&GT;,&LT;&LT; 4 bytes&gt;&gt;,&#39; HTTP / 1.1&#39;,{{127,0,0,1},49720},&lt;&lt;&lt; 9字节&gt;&gt;,undefined,4004,&lt;&lt; 11 bytes&gt;&gt;,undefined,&lt;&lt; 0 bytes&gt;&gt;,[],[{action,&lt;&lt; 10 bytes&gt;&gt;}],[{&lt;&lt; 4 字节&gt;&gt;,&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 10&gt;&gt;&gt; ;&。1 byte&gt;&gt;},{&lt;&lt;&lt; 13 bytes&gt;&gt;,&lt;&lt;&lt; 8 bytes&gt;&gt;},{&lt;&lt;&lt; 6&gt;&gt;&gt; {&LT;&10 6 字节&gt;&gt;,&lt;&lt;&lt; 12字节&gt;&gt;},{&lt;&lt;&lt; 12字节&gt;&gt;,&lt;&lt;&lt; 16字节&gt;&gt;},&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 10&gt;&gt;&gt; ;&LT; 120 字节&gt;&gt;},{&lt;&lt; 13字节&gt;&gt;,&lt;&lt;&lt; 36字节&gt;&gt;},{&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&gt;&gt;&gt; {&LT;&LT; 3 字节&gt;&gt;,&lt;&lt; 1字节&gt;&gt;},{&lt;&lt; 15字节&gt;&gt;,&lt;&lt; 17字节&gt;&gt;},{&lt;&lt;&lt; 15字节&gt;&gt;,&lt; ;&LT; 14 字节&gt;&gt;}],[{&lt;&lt; 12字节&gt;&gt;,{&lt;&lt; 11字节&gt;&gt;&gt;,&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 17 bytes&gt;&gt;,undefined},{&lt;&lt;&lt;&lt;&lt; 13&gt;&gt;&gt;,undefined},{&lt;&lt; 19 bytes&gt;&gt;,undefined},{&lt;&lt; 8字节&gt;&gt;,undefined},{&lt;&lt;&lt; 6字节&gt;&gt;,[...
= ERROR REPORT ==== 2014年2月5日:: 10:32:39 === Ranch监听器keychain_http已启动连接过程 cowboy_protocol:start_link / 4 at&lt; 0.182.0&gt;退出原因: {{case_clause,{OK,{http_req,#端口&LT; 0.2286&GT;,ranch_tcp,存活,和LT; 0.182.0&GT;,&LT;&LT;&#34; POST&#34;&GT;&GT;,&#39; HTTP /1.1',{{127,0,0,1},49720},<<"127.0.0.1">>,undefined,4004,<<& #34; /注册&#34;&GT;&GT;,未定义&LT;&LT;&GT;&GT;,[],[{动作,&LT;&LT;&#34;注册&#34;&GT;&GT;}], [{&LT;&LT;&#34;主机&#34;&GT;&GT;,&LT;&LT;&#34; 127.0.0.1:4004&#34;&GT;&GT;},{&LT;&LT;&#34;连接&#34;&GT;&GT;,&LT;&LT;&#34;保活&#34;&GT;&GT;},{&LT;&LT;&#34;内容长度&#34;&GT;&GT;,&LT ;&LT;&#34; 0&#34;&GT;&GT;},{&LT;&LT;&#34;缓存控制&#34;&GT;&GT;,&LT;&LT;&#34;无缓存&#34 ;&GT;&GT;},{&LT;&LT;&#34;来源&#34;&GT;&GT;,&LT;&LT;&#34;铬 - 延伸:// fhbjgbiflinjbdggehcddcbncdddomop&#34;&GT;&GT;},{ &LT;&LT;&#34;数&#34;&GT;&GT;,&LT;&LT;&#34; 233265256262&#34;&GT;&GT;},{&LT;&LT;&#34;内容类型&#34; &GT;&GT;,&LT;&LT;&#34;应用/ JSON&#34;&GT;&GT;},{&LT;&LT;&#34;用户代理&#34;&GT;&GT;,&LT;&LT;& #34; Mozilla的/ 5.0 (Macintosh; Intel Mac OS X 10_8_5)AppleWebKit / 537.36(KHTML,如 Gecko)Chrome / 32.0.1700.107 Safari浏览器/ 537.36&#34;&GT;&GT;},{&LT;&LT;&#34;邮差令牌&#34;&GT;&GT;,&LT;&LT;&#34; 61b7c8f0-b4f8-3bde-8b99-67c141242e5a& #34;&GT;&GT;},{&LT;&LT;&#34;接受&#34;&GT;&GT;,&LT;&LT;&#34; / &#34;&GT;&GT ;},{&LT;&LT;&#34; DNT&#34;&GT;&GT;,&LT;&LT;&#34; 1&#34;&GT;&GT;},{&LT;&LT;&#34; ACCEPT-编码&#34;&GT;&GT;,&LT;&LT;&#34; gzip的,放气,SDCH&#34;&GT;&GT;},{&LT;&LT;&#34;接受语言&#34;&GT;&GT; ,&LT;&LT;&#34;的en-US,连接; q = 0.8&#34;&GT;&GT;}],[{&LT;&LT;&#34;内容类型&#34;&GT;&gt;中{&LT;&LT;&#34;应用&#34;&GT;&GT;,&LT;&LT;&#34; JSON&#34;&GT;&GT;,[]}},{&LT;&LT;&#34;如果改性-因为&#34;&GT;&GT;,未定义},{&LT;&LT;&#34;如果无的匹配&#34;&GT;&GT;,未定义},{&LT;&LT;&#34;如果-unmodified-因为&#34;&GT;&GT;,未定义},{&LT;&LT;&#34;如果匹配&#34;&GT;&GT;,未定义},{&LT;&LT;&#34;接受&#34 ;&GT;&GT;,[{{&LT;&LT;&#34; &#34;&GT;&GT;,&LT;&LT;&#34; &#34;&GT;&gt;中[]},1000,[]}]},{&LT;&LT;&#34;连接&#34;&GT;&GT;,并[d&LT;&#34;保活&#34;&GT;&GT;] }],未定义,[{字符集,未定义},{media_型,{&LT; HTML&#34;&LT;&#34;文本&#34;&GT;&GT;,&LT;&LT;&#34&GT;&GT;,[]}}],等待,未定义&LT;&LT ;&GT;&GT;,真实,完成,[],&LT;&LT;&GT;&GT;,未定义},未定义}},[{cowboy_rest,process_content_type,3,[{文件,&#34; SRC / cowboy_rest.erl& #34;},{线,780}]},{cowboy_protocol,执行,如图4所示,[{文件,&#34; SRC / cowboy_protocol.erl&#34;},{线,529}]}]}
我在这里做错了什么?感谢。
答案 0 :(得分:1)
我想出来了,需要设置请求的响应并返回它。 cowboy_rest自动处理实际回复。
handle_request(Req, State) ->
{Action, Req2} = cowboy_req:binding(action, Req),
{Reply, Req3} = case Action of
<<"registered">> -> is_registered(Req2)
end,
Req3 = cowboy_req:set_resp_body(Reply, Req3),
{true, Req2, State}
.
答案 1 :(得分:0)
尝试从:
更改handle_request中的返回元组{ok,Req,State}
为:
{true,Req,State}