【问题标题】:case_clause error after successful response [cowboy rest]成功响应后 case_clause 错误 [cowboy rest]
【发布时间】:2014-03-01 18:38:16
【问题描述】:

由于某种原因,我的 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 错误:

=错误报告==== 2014 年 2 月 5 日::10:32:39 === 节点“keychain@dnldd”上的进程 出错,退出值: {{case_clause,{ok,{http_req,#Port,ranch_tcp,keepalive,,>,'HTTP/1.1',{{127,0,0,1},49720},>,未定义,4004,>,未定义,>,[],[{action,>}],[{>,>},{>,>},{>,>},{>,>},{>,>},{>,>},{>,>},{>,>},{>,>},{>,>},{>,>},{>,>},{>,>}],[{>,{>,>,[]}},{>,未定义},{>,未定义},{>,未定义},{>,未定义},{>,[...

=错误报告==== 2014 年 2 月 5 日::10:32:39 === 牧场侦听器 keychain_http 的连接过程开始于 cowboy_protocol:start_link/4 at 退出原因: {{case_clause,{ok,{http_req,#Port,ranch_tcp,keepalive,,>,'HTTP/1.1',{{127,0,0,1} ,49720},>,undefined,4004,>,undefined,>,[],[{action,>}] ,[{>,>},{>,>},{>,>},{>,>},{>,>},{>,>},{>,>}, {>,>},{>,>},{>,/">>},{>,>},{>, >},{>,>}],[{>,{>,>,[]}},{>,undefined},{>,undefined},{>,undefined},{>,undefined},{>,[{{">>, ">>,[]},1000,[]}]},{>,[>]}],undefined,[{字符集,未定义},{media_type,{>,>,[]}}],等待,未定义,>,true,done,[], >,undefined},undefined}},[{cowboy_rest,process_content_type,3,[{file,"src/cowboy_rest.erl"},{line,780}]},{cowboy_protocol,execute,4,[{file," src/cowboy_protocol.erl"},{line,529}]}]}

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

【问题讨论】:

    标签: erlang cowboy ranch


    【解决方案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}
    .
    

    【讨论】:

    • Req3 似乎没有被使用。这是一个错字吗?最后一行不应该是{true, Req3, State}吗?那么true 呢?在您对 mkorszun 的回答的评论中,您声称 true 不起作用?
    【解决方案2】:

    尝试更改您的 handle_request 中的返回元组:

    {ok, Req, State}

    到:

    {true, 请求, 状态}

    【讨论】:

    • 没有骰子。当我将 'ok' 替换为 'true' 时,它会生成 function_clause 错误。
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2018-01-08
    • 2019-04-02
    • 2018-09-20
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多