ошибка case_clause после успешного ответа [ковбойский отдых]

мой сервер 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 после каждого запроса:

=ОТЧЕТ О ОБ ОШИБКЕ==== 5 февраля 2014 г.::10:32:39 === Ошибка в процессе ‹0.182.0> на узле 'keychain@dnldd' со значением выхода: {{case_clause,{ok,{http_req ,#Port‹0.2286>,ranch_tcp,keepalive,‹0.182.0>,‹‹4 байта>>, 'HTTP/1.1', {{127,0,0,1},49720},‹‹9 байт>> ,не определено,4004,‹‹11 байт>>,не определено,‹‹0 байт>>,[],[{действие,‹‹10 байт>>}],[{‹‹4 байта>>,‹‹14 байт >>},{‹‹10 байт>>,‹‹10 байт>>},{‹‹14 байт>>,‹‹1 байт>>},{‹‹13 байт>>,‹‹8 байт>> },{‹‹6 байт>>,‹‹51 байт>>},{‹‹6 байт>>,‹‹12 байт>>}, {‹‹12 байт>>,‹‹16 байт>>}, {‹‹10 байт>>,‹‹120 байт>>},{‹‹13 байт>>,‹‹36 байт>>}, {‹‹6 байт>>,‹‹3 байт>>},{‹ ‹3 байта>>, ‹‹1 байт>>},{‹‹15 байтов>>, ‹‹17 байтов>>}, {‹‹15 байтов>>, ‹‹14 байтов>>}],[{‹ ‹12 байтов>>,{‹‹11 байтов>>, ‹‹4 байта>>,[]}}, {‹‹17 байтов>>, не определено}, {‹‹13 байтов>>, не определено}, {‹ ‹19 байтов>>, не определено}, {‹‹8 байтов>>, не определено}, {‹‹6 байтов>>,[...

=ОТЧЕТ О ОБ ОШИБКЕ==== 5 февраля 2014 г.::10:32:39 === У слушателя Ranch keychain_http был запущен процесс соединения с cowboy_protocol:start_link/4 в ‹0.182.0> выход с причиной: {{case_clause,{ ok,{http_req,#Port‹0.2286>,ranch_tcp,keepalive,‹0.182.0>,‹‹"POST">>, 'HTTP/1.1', {{127,0,0,1},49720},‹ ‹"127.0.0.1">>,не определено,4004,‹‹"/зарегистрировано">>,не определено,‹‹>>,[],[{действие,‹‹"зарегистрировано">>}],[{‹‹ "хост">>,‹‹"127.0.0.1:4004">>},{‹‹"соединение">>,‹‹"поддерживать активность">>},{‹‹"длина содержимого">>, ‹‹"0">>},{‹‹"управление кешем">>,‹‹"без кеша">>},{‹‹"происхождение">>,‹‹"chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop ">>},{‹‹"номер">>,‹‹"233265256262">>},{‹‹"тип содержимого">>,‹‹"приложение/json">>},{‹‹"пользователь -agent">>,‹‹"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/32.0.1700.107 Safari/537.36">>},{‹‹"postman-token ">>,‹‹"61b7c8f0-b4f8-3bde-8b99-67c141242e5a">>},{‹‹"принять">>,‹‹"/">>},{‹‹" dnt">>,‹‹"1">>},{‹‹"accept-encoding">>,‹‹"gzip,deflate,sdch">>},{‹‹"accept-l язык">>,‹‹"en-US,en;q=0.8">>}],[{‹‹"тип содержимого">>,{‹‹"приложение">>,‹‹"json"> >,[]}},{‹‹"if-modified-since">>, undefined},{‹‹"if-none-match">>, undefined},{‹‹"if-unmodified-since"> >,undefined},{‹‹"if-match">>,undefined},{‹‹"accept">>,[{{‹‹"">>,‹‹""> >,[]},1000,[]}]},{‹‹"соединение">>,[‹‹"поддержка активности">>]}],undefined,[{charset,undefined},{media_type,{ ‹‹"text">>,‹‹"html">>,[]}}],waiting,undefined,‹‹>>,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"},{ строка,529}]}]}

Что я здесь делаю неправильно? Спасибо.


person dnldd    schedule 05.02.2014    source источник


Ответы (2)


Я разобрался, нужно было задать ответ на запрос и вернуть его. 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}
.
person dnldd    schedule 06.02.2014
comment
Req3, похоже, не используется. Это опечатка? Разве последняя строка не должна быть {true, Req3, State}? А как же true? В своем комментарии к ответу mkorszun вы утверждаете, что true не сработало? - person TNT; 12.06.2015

Попробуйте изменить возвращаемый кортеж в вашем handle_request с:

{хорошо, запрос, состояние}

to:

{истина, требование, состояние}

person mkorszun    schedule 05.02.2014
comment
Нет игральных костей. Он генерирует ошибку function_clause, когда я заменяю «ok» на «true». - person dnldd; 05.02.2014