2017-01-29 13 views
0

는 POST 요청을 받아 ETS 테이블 여기카우보이 POST 핸들러

로를 저장하려고하면 내가 말릴 때 코드

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 오류가 발생했습니다 :

= ERROR REPORT ==== 29-Jan-2017 :: 18 : 57 : 21 === 목장 청취자 http, 연결 프로세스 < 0.240.0>, 스트림 1의 요청 프로세스가 < 0.241.0> 종료되었습니다. 이유가있는 badarg 및 stacktrace [{ets, insert, [뉴스, {25, 오늘, < < "액션 \": \ "삽입 \", \ "키 \": \ "some_key \", \ "값 \ {dev/news/_build/default/lib/news/src /} ","[1,2,3]} ","/dev/news/_build/default/lib/news/src/post_handler.erl "}, {post_handler.erl"}, {line, 25}}}, {post_handler, init, 2, }}, {cowboy_handler, execute, 2, {{파일, "/ dev/news/_build/default/lib/cowboy/src/cowboy_handler.erl"}, {line, {cowboy_stream_h, proc_lib_hack, 3,} {cowboy_stream_h, execute, 3, {{파일, "/ dev/news/_build/default/lib/cowboy/src/cowboy_stream_h.erl"}, {line, 173}}} [{file, "e :/_ dev/news/_build/default/lib/cowboy/src/cowboy_stream_

하지만 에코처럼 사용할 때 (예 : h.erl "}, {line, 158}]}, {proc_lib, init_p_do_apply, 3, {proc_lib.erl"}}

그래서 - : 이것은 ({ "삽입", "키": "some_key", "값"[1,2,3] '액션'})

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

I 요청을받을 ETS에 뭔가있는 것처럼 보입니까? 새로운 (뉴스, [오더, 보호, named_table, {keypos, 1}, {read_concurrency 사실}, {write_concurrency :하지만 난 다른 모듈

ETS에서 ETS 만들기

을 엉망으로 아무 생각이 없다 사실은}])이 문제

+0

ETS 테이블을 만드는 방법과 장소는 어디입니까? 당신은 그것이'named_table'이고 그 이름은'news'입니까? – Dogbert

+0

@Dogbert 나는이 모듈을 -record (news, {id, created, article})와 같이 시작 모듈에서 만들었습니다. {ok, Tab} : Tab = ets : new (뉴스, [ordered_set, protected, named_table, {keypos, 1}, {read_concurrency, true}, {write_concurrency, true}]) – Qbeck

+0

@Qbeck, 질문에 해당 내용을 편집해야합니다. –

답변

2

에게 ets:new 전화의 protected 옵션을 해결하기 위해 나에게 바로 dirrection을 보여주십시오 수

만 ETS 테이블을 생성 프로세스가 insert 데이터에 허용되는 것을 의미합니다. 다른 프로세스는 데이터를 읽을 수만 있습니다.

대신 public을 사용하면 모든 프로세스에 읽기/쓰기 권한이 부여됩니다.

+0

당신은 완전히 옳습니다. 이제 완벽하게 작동합니다. 고마워. 매우 감사 – Qbeck