2017-01-29 4 views
0

Попытка получить запрос POST и сохранить его в таблицуCowboy POST обработчика

здесь ETS является кодом

init(Req0, Opts) -> 
    Method = cowboy_req:method(Req0), 
    HasBody = cowboy_req:has_body(Req0), 
    Req = maybe_echo(Method, HasBody, Req0), 
    {ok, Req, Opts}. 

maybe_echo(<<"POST">>, true, Req0) -> 
    {ok, PostVals, Req} = cowboy_req:read_urlencoded_body(Req0), 
    Echo = proplists:get_value(<<"echo">>, PostVals), 
    echo(Echo, Req); 

maybe_echo(<<"POST">>, false, Req) -> 
    cowboy_req:reply(400, [], <<"Missing body.">>, Req); 

maybe_echo(_, _, Req) -> 
    %% Method not allowed. 
    cowboy_req:reply(405, Req). 

echo(undefined, Req) -> 
    cowboy_req:reply(400, [], <<"Missing echo parameter.">>, Req); 

echo(Echo, Req) -> 
Inf = #news{id=25, created=today, article=Echo}, 
    case ets:insert(news, {Inf#news.id, Inf#news.created, Inf#news.article}) of 
     true -> cowboy_req:reply(200, #{<<"content-type">> => <<"text/plain; charset=utf-8">>}, Echo, Req); 
     _  -> 
      Error = <<"{\"error\": \"error\"}">>, 
      cowboy_req:reply(200, #{<<"content-type">> => <<"text/plain; charset=utf-8">>}, Error, Req) 
    end. 

когда я свернуться:

$ локоны -i -H «Контент- Тип: application/json «-X POST -d echo = '{« action »:« insert »,« key »:« some_key »,« value »: [1,2,3]}' http://localhost:8080/

I 'm получение ошибки:

= СООБЩЕНИЕ ОШИБКИ ==== 29-янв-2017 :: 18: 57: 21 === Ранчо слушателя http, процесс подключения < 0.240.0>, поток 1 имел свой запрос процесса < 0.241.0> exit с аргументом badarg и stacktrace [{ets, insert, [news, {25, today, < < "{\" действие \ ": \" insert \ ", \" key \ ": \" some_key \ ", \" значение \ ": [1,2,3]}" >>}], []}, {post_handler, эхо, 2, [{файл, "е:/_ DEV/новости/_build/по умолчанию/Библиотека/новости/SRC/post_handler.erl "}, {линия, 25}]}, {post_handler, первонач, 2, [{файл," е:/_ DEV/новости/_build/по умолчанию/Библиотека/новости/SRC/post_handler.erl "}, { линия, 8}]}, {cowboy_handler, выполнение, 2, [{файл, "е:/_ DEV/новости/_build/по умолчанию/Библиотека/ковбой/SRC/cowboy_handler.erl"}, {линия, 39}]}, {cowboy_stream_h, выполнение, 3, [{файл, "е:/_ DEV/новости/_build/по умолчанию/Библиотека/ковбой/SRC/cowboy_stream_h.erl"}, {линия, 173}]}, {cowboy_stream_h, proc_lib_hack, 3, [{файл, "е:/_ DEV/новости/_build/по умолчанию/Библиотека/ковбой/SRC/cowboy_stream_ h.erl "}, {line, 158}]}, {proc_lib, init_p_do_apply, 3, [{file," proc_lib.erl "}, {line, 247}]}]

, но когда я использую эхо как это:

echo(Echo, Req) -> 
    cowboy_req:reply(200, #{<<"content-type">> => <<"text/plain; charset=utf-8">>}, Echo, Req) 
     end. 

я получаю запрос - ({ "действие": "вставить", "ключ": "some_key", "значение": [1,2,3]})

так похоже, что есть что-то с ETS? но я понятия не имею, где я перепутались

Создание ETS в другом модуле

етсь: новый (новости, [ordered_set, защищенные, named_table, {keypos, 1}, {read_concurrency, верно}, {write_concurrency, правда}])

могли бы вы показать мне правильный dirrection, чтобы решить эту проблему

+0

Как и где вы создаете таблицу ETS? Вы уверены, что это 'named_table', а имя -' news'? – Dogbert

+0

@Dogbert Я создал его в стартовом модуле -record (news, {id, created, article}). Tab = ets: new (news, [ordered_set, protected, named_table, {keypos, 1}, {read_concurrency, true}, {write_concurrency, true}]), {ok, Tab}. – Qbeck

+0

@Qbeck, вы должны отредактировать это в вопросе. –

ответ

2

в protected опции в ets:new вызова означает, что только процесс создания таблицы ETS будет разрешено insert данных. Другие процессы могут читать только данные.

Используйте public, а все процессы будут иметь доступ для чтения/записи.

+0

Ты совершенно прав. Теперь отлично. Спасибо. Очень признателен – Qbeck

 Смежные вопросы

  • Нет связанных вопросов^_^