2017-01-29 1 views
0

Essayer de recevoir la requête POST et le stocker dans la table ETSCowboy gestionnaire POST

voici le code

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. 

quand je recroqueville:

boucle $ -i -H « Content- Type: application/json "-X POST -d echo = '{" action ":" insérer "," clé ":" touche_quot "," valeur ": [1,2,3]}'

I Je reçois l'erreur:

= RAPPORT D'ERREUR ==== 29-Jan-2017 :: 18: 57: 21 === Ranch écouteur http, processus de connexion < 0.240.0>, le flux 1 a eu son processus de demande < 0.241.0> sortie avec raison badarg et stacktrace [{ets, insert, [news, {25, aujourd'hui, < < "{\" action \ ": \" insérer \ ", \" clé \ ": \" clé_unique \ ", \" valeur \ ": [1,2,3]}" >>}], []}, {post_handler, echo, 2, [{fichier, "e:/_ dev/nouvelles/_build/default/lib/nouvelles/src/post_handler.erl "}, {line, 25}]}, {post_handler, init, 2, [{fichier," e:/_ dev/nouvelles/_build/default/lib/nouvelles/src/post_handler.erl "}, { line, 8}], {cowboy_handler, execute, 2, [{fichier, "e:/_ dev/nouvelles/_build/default/lib/cowboy/src/cowboy_handler.erl"}, {ligne, 39}]}, {cowboy_stream_h, execute, 3, [{fichier, "e:/_ dev/nouvelles/_build/default/lib/cowboy/src/cowboy_stream_h.erl"}, {ligne, 173}]}, {cowboy_stream_h, proc_lib_hack, 3, [{fichier, "e:/_ dev/nouvelles/_build/default/lib/cowboy/src/cowboy_stream_ h.erl "}, {line, 158}]}, {proc_lib, init_p_do_apply, 3, [{fichier," proc_lib.erl "}, {ligne, 247}]}]

mais quand j'utilise l'écho comme ceci:

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

Je reçois la demande - ({ "action": "insérer", "clé": "some_key", "valeur": [1,2,3]})

si semble qu'il y a quelque chose avec ETS? mais je ne sais pas où je foiré

Création ets dans d'autres modules

ets: nouvelle (nouvelles, [ordered_set, protégées, named_table, {keypos, 1}, {read_concurrency, true}, {write_concurrency, true}])

pourriez-vous s'il vous plaît me montrer le droit dirrection pour résoudre ce problème

+0

Comment/où créez-vous la table ETS? Etes-vous sûr que c'est un named_table et que le nom est news? – Dogbert

+0

@Dogbert Je l'ai créé dans le module de démarrage comme ceci -record (news, {id, created, article}). Tab = ets: nouveau (news, [ordered_set, protected, named_table, {keypos, 1}, {read_concurrency, true}, {write_concurrency, true}]), {ok, Tab}. – Qbeck

+0

@Qbeck, vous devriez le modifier dans la question. –

Répondre

2

l'option protected dans le ets:new appel signifie que seul le processus de création de la table ETS sera autorisé à insert données. Les autres processus peuvent uniquement lire les données. À la place, utilisez public et tous les processus auront un accès en lecture/écriture.

+0

Vous avez totalement raison. Travailler parfaitement maintenant. THX. Très appréciée – Qbeck