2015-02-04 3 views
0

Извините за мой бассейн Englsih :-) Мой код здесь: http://pastebin.com/zus6dGdz Я просто хочу, чтобы использовать poolboy как мои пулы соединения с базой данных, и я используйте mongodb-erlang как мой драйвер, чтобы общаться с mongodb.Почему ошибка «function_clause», о Erlang, MongoDB-Erlang, MongoDB

После его выполнения, из отчета оболочки, я уверен, что MongoDB-Эрл создал бассейны для меня

***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.174.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.178.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.180.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.182.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.184.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.186.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.188.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.190.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.192.0> 
***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:73 
    Database Connection:<0.194.0> 

и я использую пулы, как это: кода оснастку здесь (в hello_handler. Эрл, может найти его через URL-адрес выше):

get_user(Name, Req) -> 
    Collection = <<"user">>, 
    Selector = {name, Name}, 
    Worker = poolboy:checkout(?DB_Conn_Pool), 
    io:format("***************************Debug*********************************~n Module:~p ~n Line:~p ~n Worker:~p ~n", [?MODULE, ?LINE, Worker]), 
    Request = {get_user, {Collection, Selector}}, 
    UserInfo = gen_server:call(Worker, Request), 
    io:format("***************************Debug*********************************~n Module:~p ~n Line:~p ~n UserInfo:~p ~n", [?MODULE, ?LINE, UserInfo]), 
    cowboy_req:reply(200, [ 
    {<<"content-type">>, <<"text/plain">>} 
    ], UserInfo, Req). 

И процесс работник будет обрабатывать запрос в функции handle_call/3 в db_mongo_handler.erl

код оснастки:

handle_call({get_user, {Collection, Selector}}, _From, #state{connection = Connection} = State) -> 
    io:format("***************************Debug*********************************~n 
    Module:~p ~n Line:~p ~n Handle_call Connection:~p ~n Collection:~p ~n 
    Selector:~p ~n Connection is is_pid()? ~p ~n Collection is binary()? ~p ~n", 
    [?MODULE, ?LINE, Connection, Collection, Selector, is_pid(Connection), is_binary(Collection)]), 
    Cursor = mongo:find(Connection, Collection, Selector), 
    io:format("***************************Debug*********************************~n Module:~p ~n Line:~p ~n 
    Cursor:~p ~n", [?MODULE, ?LINE, Cursor]), 
    Result = mc_cursor:rest(Cursor), 
    [Head | _] = Result, 
    {_, _, _, NameValue, _, AgeValue} = Head, 
    io:format("***************************Debug*********************************~n Module:~p ~n Line:~p ~n 
    NameValue:~p ~n AgeValue:~p ~n ", [?MODULE, ?LINE, NameValue, AgeValue]), 
    BackData = binary_to_list(<<NameValue/bits, <<":">>/bits, AgeValue/bits>>), 
    {reply, BackData, State}. 

Однако бросить ошибку из этого кода:

Cursor = mongo:find(Connection, Collection, Selector), 

И отчет об ошибке:

***************************Debug********************************* 

    Module:db_mongo_handler 
    Line:104 
    Handle_call Connection:<0.194.0> 
Collection:<<"user">> 

    Selector:{name,<<"three">>} 
Connection is is_pid()? true 
Collection is binary()? true 

=ERROR REPORT==== 4-Feb-2015::14:48:39 === 
** Generic server <0.194.0> terminating 
** Last message in was {query,false,false,false,false,<<"user">>,0,0, 
           {name,<<"zhk">>}, 
           []} 
** When Server state == {state,#Port<0.2666>, 
           {dict,0,16,16,8,80,48, 
            {[],[],[],[],[],[],[],[],[],[],[],[],[], 
             [],[],[]}, 
            {{[],[],[],[],[],[],[],[],[],[],[],[],[], 
             [],[],[]}}}, 
           <<>>, 
           {conn_state,unsafe,master,"user"}} 
** Reason for termination == 
** {function_clause, 
     [{mongo_protocol,binarize, 
      ["user"], 
      [{file,"src/core/mongo_protocol.erl"},{line,108}]}, 
     {mongo_protocol,dbcoll,2, 
      [{file,"src/core/mongo_protocol.erl"},{line,44}]}, 
     {mongo_protocol,put_message,3, 
      [{file,"src/core/mongo_protocol.erl"},{line,74}]}, 
     {mc_worker_logic,'-encode_requests/2-fun-0-',3, 
      [{file,"src/connection/mc_worker_logic.erl"},{line,22}]}, 
     {lists,foldl,3,[{file,"lists.erl"},{line,1261}]}, 
     {mc_worker_logic,make_request,3, 
      [{file,"src/connection/mc_worker_logic.erl"},{line,73}]}, 
     {mc_worker,handle_call,3, 
      [{file,"src/connection/mc_worker.erl"},{line,75}]}, 
     {gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,607}]}]} 

У меня попробовать этот код в Erlang оболочке,

Cursor = mongo: find (Connection, Collection, Selector),

может успешно работать, и у меня есть проверить MongoDB, тип переменной, но в конце концов я понятия не имею, как решить эту проблему problem.Please мне помочь !!: ->

ответ

1

Проблема, как представляется, связано с conn_state запись,

-record(conn_state, { 
    write_mode = unsafe :: write_mode(), 
    read_mode = master :: read_mode(), 
    database :: database() 
}). 

-type database() :: binary | atom(). 

И у вас есть:

{conn_state,unsafe,master,"user"} 

где пользователь является строкой() не бинарной или атома.

Функция mongo_protocol: binarize/1 принимает только параметры как двоичные файлы или атомы.

Изменение hello_erlang.app.src значения базы данных для:

{database, user}, 

или {базы данных, < < "пользователя" >>},

С уважением

+0

Да, вы правы , и когда я сталкиваюсь с проблемой. Я всегда удивляюсь значению отчета. Как и на этот раз, можете ли вы рассказать мне, что означает значение {conn_state, unsafe, master, "user"}, значение conn_state , значение небезопасного, значение мастера 2. И где я могу найти такой смысл отчета? Www.erlang.org ???? –

+0

Прочитайте исходный код драйвера de mongodb-erlang, чтобы узнать значение различных параметров. – mdaguete

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