成功回复后出现case_clause错误[牛仔休息]

时间:2014-02-05 11:04:33

标签: erlang cowboy ranch

我的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}]}]}

我在这里做错了什么?感谢。

2 个答案:

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