2016-12-06 1 views
0

J'utilise cowboy pour les services basés sur REST en utilisant mongoDB. Obtenir l'erreur valeur BSON à la conversion JSON (ie « _id » en valeur MongoDB) peut-on est d'avoir idée, comment récupérer les documents MongoDB et convertir en JSON et pousser immobilisant servicescowboy pour les services basés sur REST utilisant mongoDB. Obtenir la valeur d'erreur BSON à la conversion JSON

{ok, Connection} = mongo_config:connect(), 
    Collection = <<"user">>, 
    Selection = {}, 
    Userdata = mc_worker_api:find(Connection, Collection, Selection), 
    Result = mc_cursor:rest(Userdata), 
    mc_cursor:close(Userdata), 
    io:format(" users data ~p ~n", [Result]), 
    Re = jsx:encode(Result), 
    Req = cowboy_req:reply(200, #{ 
     <<"content-type">> => <<"text/plain">> 
    }, Re, Req0), 
    {ok, Req, State}; 

Erreur -

Error: Ranch listener my_http_listener, connection process <0.192.0>, stream 1 had its request process <0.193.0> exit with reason badarg and stacktrace [{jsx_parser,value,4,[{file,"src/jsx_parser.erl"},{line,152}]},{user_handler,init,2,[{file,"src/user_handler.erl"},{line,19}]},{cowboy_handler,execute,2,[{file,"src/cowboy_handler.erl"},{line,39}]},{cowboy_stream_h,execute,3,[{file,"src/cowboy_stream_h.erl"},{line,172}]},{cowboy_stream_h,proc_lib_hack,3,[{file,"src/cowboy_stream_h.erl"},{line,157}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]

Répondre

1

Le client mongo retourne les documents BSON qui ressemblent à {key1, value1, key2, value2, key3, value3}. Pour produire du JSON, jsx:encode() nécessite une entrée sous la forme d'une liste de biens comme [{key1, value1}, {key2, value2}, {key3, value3}] ou une carte du type #{key1 => value1, key2 => value2, key3 => value3}. En d'autres termes, vous ne pouvez pas prendre la sortie du client mongo et la passer directement à jsx. Vous devrez d'abord effectuer une légère conversion de données. Quelque chose comme

to_map([]) -> 
    #{}; 
to_map([K, V | Rest]) -> 
    M = to_map(Rest), 
    M#{K => V}. 

Vous pouvez alors:

> Bson = {key1, value1, key2, value2, key3, value3}. 
> to_map(tuple_to_list(Bson)). 
#{key1 => value1,key2 => value2,key3 => value3}