2014-11-26 4 views
0

websocket 연결을 통해 boss_db를 사용하여 데이터를 반환하려고합니다. 이 예제에서는 가져온 질문을 반환하고, 로그가 질문을 인쇄하는 것을 볼 수 있지만 이유와 함께 종료되는 오류가 있습니다. 잘못된 반환 값 : 확인. 모든 도움/방향을 부탁드립니다. 여기오류 시카고 보스의 websocket을 통해 boss_db 데이터를 반환하는 중

websocket/fan_games_game_websocket.erl 

-module(fan_games_game_websocket, [Req, SessionId]). 

-behaviour(boss_service_handler). 

-record(state,{users}). 

%% API 
-export([ 
    init/0, 
    handle_incoming/4, 
    handle_join/3, 
    handle_broadcast/2, 
    handle_close/4, 
    handle_info/2, 
    terminate/2 
]). 

init() -> 
    io:format("~p (~p) starting...~n", [?MODULE, self()]), 
    %timer:send_interval(1000, ping), 
    {ok, #state{users=dict:new()}}. 

handle_join(ServiceName, WebSocketId, State) -> 
    error_logger:info_msg("~p ~p ~p", [ServiceName, WebSocketId, SessionId]), 
    #state{users=Users} = State, 
    {noreply, #state{users=dict:store(WebSocketId, SessionId, Users)}}. 

handle_close(Reason, ServiceName, WebSocketId, State) -> 
    #state{users=Users} = State, 
    io:format("ServiceName ~p, WebSocketId ~p, SessiondId ~p, close for Reason ~p~n", 
       [ServiceName, WebSocketId, SessionId, Reason]), 
    {noreply, #state{users=dict:erase(WebSocketId, Users)}}. 

handle_broadcast(Message, State) -> 
    io:format("Broadcast Message ~p~n",[Message]), 
    {noreply, State}. 

handle_incoming(_ServiceName, WebSocketId, Message, State) -> 
    error_logger:info_msg(Message), 
    Questions = boss_db:find(question, []), 
    error_logger:info_msg("~p~n", [Questions]), 
    WebSocketId ! {text, list_to_binary(Questions)}, 
    {noreply, State}. 

handle_info(state, State) -> 
    #state{users=Users} = State, 
    error_logger:info_msg("state:~p~n", [Users]), 
    {noreply, State}; 

handle_info(ping, State) -> 
    error_logger:info_msg("pong:~p~n", [now()]), 
    {noreply, State}; 

handle_info(tic_tac, State) -> 
    #state{users=Users} = State, 
     Fun = fun(X) when is_pid(X)-> X ! {text, "tic tac"} end, 
     All = dict:fetch_keys(Users), 
     [Fun(E) || E <- All], 
    {noreply, State}; 

handle_info(_Info, State) -> 
    {noreply, State}. 

terminate(_Reason, _State) -> 
    ok. 


question.erl 
-module(question, [Id, GameId, Text]). 
-has({answers, many}). 
-belongs_to(game). 

얘들이 당신의 제안을 내 업데이트 로그를 다음과 같습니다 : 여기

"는"

11:14:25.401 [info] a 
fan_games_game_websocket (<0.299.0>) starting... 
11:14:25.401 [info] [{question,"question-2","game-2","Who will have the most rushing yards in the first quarter?"}] 

11:14:25.402 [error] ** Boss Service Handler fan_games_game_websocket terminating in handle_incoming/4 
    for the reason error:badarg 
ServiceUrl: "/websocket/game" 
WebSocketId: <0.285.0> 
SessionId : undefined 
Message : <<"a">> 
State : {state,{dict,0,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}} 
** Stacktrace: [{erlang,list_to_binary,[[{question,"question-2","game-2","Who will have the most rushing yards in the first quarter?"}]],[]},{fan_games_game_websocket,handle_incoming,5,[{file,"/Users/blanecordes/Documents/Code/erlang/fan_game/fan_games/src/websocket/fan_games_game_websocket.erl"},{line,42}]},{boss_service_worker,handle_cast,2,[{file,"src/boss/boss_service_worker.erl"},{line,173}]},{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,604}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}] 


11:14:25.402 [error] gen_server fan_games_game_websocket terminated with reason: bad return value: ok 
11:14:25.402 [error] CRASH REPORT Process <0.297.0> with 0 neighbours exited with reason: bad return value: ok in gen_server:terminate/6 line 744 
11:14:25.402 [error] Supervisor {global,boss_service_sup} had child fan_games_game_websocket started with boss_service_worker:start_link(fan_games_game_websocket, <<"/websocket/game">>) at <0.297.0> exit with reason bad return value: ok in context child_terminated 
를 제출 샘플 요청의 로그입니다 아래

내 코드와 오류입니다
+1

스티브가 맞을 것 같습니다. 또한'error_logger : info_msg (Questions)'를'error_logger : info_msg ("~ p ~ n", [Questions]) '로 변경하여 출력의 두 번째 줄에서 "FORMAT ERROR"를 방지 할 것을 권장합니다. – tkowal

+0

@tkowal 로깅 할 때이 오류가 해결되었습니다. – BC00

답변

3

이 문제는 줄에서 오는 것이라고 생각합니다.

WebSocketId ! {text, <<Questions>>}, 

handle_incoming/4인데, 이는 <<Questions>>이 적절한 이진 파일이 아니기 때문입니다. 이를 다음으로 변경하십시오 :

WebSocketId ! {text, list_to_binary(Questions)}, 

대신에 변경하십시오.

+0

변경 사항을 따르는 바이너리 오류 목록이 표시됩니다. 현재 상태를 반영하도록 위의 코드를 업데이트했습니다.이 점을 도와 주셔서 감사합니다. – BC00

+0

'list_to_binary/1'에서 오류가 발생하면'Questions'가 분명히 목록이 아닙니다. 로그에'#questions {}'레코드가있는 것 같습니다. 그렇다면'WebSocketId' 프로세스에 레코드의 관련 텍스트 필드 만 보내거나 원하는 경우'Questions' 값 전체를 그대로 보내십시오. 'WebSocketId' 프로세스가'{text, ...}'메시지로 무엇을하는지 모르겠습니다. 그래서 정확히 무엇을 해야할지 말할 수 없습니다. –