通过芝加哥boss中的websocket返回boss_db数据时出错

通过芝加哥boss中的websocket返回boss_db数据时出错,websocket,erlang,cowboy,chicagoboss,Websocket,Erlang,Cowboy,Chicagoboss,我试图通过websocket连接返回使用boss_db获得的数据。在这个示例中,我想返回我获取的问题,您可以看到日志打印出问题,但是有一些错误导致终止,原因是:返回值错误:ok 下面是我的代码和错误: websocket/fan_games_game_websocket.erl -module(fan_games_game_websocket, [Req, SessionId]). -behaviour(boss_service_handler). -record(state,{users

我试图通过websocket连接返回使用boss_db获得的数据。在这个示例中,我想返回我获取的问题,您可以看到日志打印出问题,但是有一些错误导致终止,原因是:返回值错误:ok

下面是我的代码和错误:

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).
websocket/fan\u games\u game\u websocket.erl
-模块(fan_games_game_websocket,[Req,SessionId])。
-行为(老板、服务、处理人)。
-记录(状态,{users})。
%%原料药
-出口([
init/0,
处理\u传入/4,
手柄连接/3,
处理广播/2,
手柄关闭/4,
处理信息/2,
终止/2
]).
init()->
io:格式(“~p(~p)开始…~n”,[?模块,self()]),
%定时器:发送间隔(1000,ping),
{ok,#state{users=dict:new()}。
handle\u join(ServiceName、WebSocketId、State)->
错误记录程序:info\u msg(“~p~p~p”,[ServiceName,WebSocketId,SessionId]),
#状态{users=users}=state,
{noreply,#state{users=dict:store(WebSocketId,SessionId,users)}。
句柄\关闭(原因、服务名称、WebSocketId、状态)->
#状态{users=users}=state,
io:format(“ServiceName~p,WebSocketId~p,SessiondId~p,关闭原因~p~n”,
[ServiceName、WebSocketId、SessionId、Reason]),
{noreply,#state{users=dict:erase(WebSocketId,users)}。
处理广播(消息、状态)->
io:格式(“广播消息~p~n”,[Message]),
{诺雷普利州}。
处理\u传入(\u ServiceName、WebSocketId、消息、状态)->
错误日志:信息消息(消息),
Questions=boss\u db:find(问题,[]),
错误记录程序:信息消息(“~p~n”,[Questions]),
WebSocketId!{文本,列表到二进制(问题)},
{诺雷普利州}。
句柄信息(状态,状态)->
#状态{users=users}=state,
错误记录程序:信息消息(“状态:~p~n,[Users]),
{诺雷普利州};
句柄信息(ping,State)->
错误记录程序:info\u msg(“pong:~p~n,[now()]),
{诺雷普利州};
处理信息(议会、州)->
#状态{users=users}=state,
Fun=Fun(X)什么时候是_pid(X)->X!{文本,“tic tac”}结束,
All=dict:获取密钥(用户),
[乐趣(E)| | E
{诺雷普利州}。
终止(_原因,_状态)->
好啊
问题.呃
-模块(问题[Id,GameId,文本])。
-有({答案,很多})。
-属于(游戏)。
更新 以下是我的更新日志和您的建议:

以下是提交“a”的示例请求的日志

11:14:25.401[info]a
fan\u games\u game\u websocket()开始。。。
11:14:25.401[信息][{问题,“问题-2”,“第二场”,“第一节谁的场地最快?”}]
11:14:25.402[错误]**Boss服务处理程序fan\u games\u games\u websocket终止于句柄\u传入/4
原因错误:badarg
ServiceUrl:“/websocket/game”
WebSocketId:
会话ID:未定义
信息:
状态:{State,{dict,0,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}
**Stacktrace:[{erlang,list_to_binary,[[{question,“question-2”,“game-2”,“谁将在第一季度拥有最繁忙的场地?”}],[},{fan_games_game_websocket,handle_incoming,5,[{file,“/Users/blanecordes/Documents/Code/erlang/fan_game/fan_games/fan_games/src/websocket/fan_games_games_games_game_websocket.erl},{line,42},{boss_service_service_worker,handle,},{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[错误]gen_服务器fan_games_game_websocket因以下原因终止:返回值不正确:ok
11:14:25.402[错误]0邻居的崩溃报告进程退出,原因:返回值错误:gen_服务器中的ok:terminate/6行744
11:14:25.402[错误]主管{global,boss\u service\u sup}已使用boss\u service\u worker启动子fan\u game\u websocket:start\u链接(fan\u game\u websocket,)在出口处,原因返回值不正确:上下文中的ok child\u已终止

我认为问题出在线路上

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

相反。

我认为问题出在线路上

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

相反。

我认为问题出在线路上

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

相反。

我认为问题出在线路上

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

相反。

Steve可能是对的。我还建议将
error\u logger:info\u msg(Questions)
更改为
error\u logger:info\u msg(“~p~n,[Questions])
,这将防止“格式错误”在输出的第二行。@tkowal感谢这似乎解决了记录Steve可能是对的错误。我还建议将
error\u logger:info\u msg(Questions)
更改为
error\u logger:info\u msg(“~p~n,[Questions])
,这将防止“格式错误”在输出的第二行。@tkowal感谢这似乎解决了记录Steve可能是对的错误。我还建议将
error\u logger:info\u msg(Questions)
更改为
error\u logger:info\u msg(“~p~n,[Questions])
,这将防止“格式错误”在输出的第二行。@tkowal感谢这似乎解决了记录Steve可能是对的错误。我还建议将
error\u logger:info\u msg(Questions)
更改为
error\u logger:info\u msg(“~p~n,[Questions])
,这将防止“格式错误”在输出的第二行。@tkowal感谢这似乎解决了日志记录时的错误。在您的更改后,我看到一个从列表到二进制的错误,我更新了上面的代码以反映当前状态,非常感谢您的帮助。如果您看到从
列表到二进制/1的错误,那么
问题显然不是列表。从您的日志它看起来可能是一条
#questions{}
记录?如果是这样,要么只将记录的相关文本字段发送到
WebSocketId
进程,要么如果愿意,按原样发送整个
questions
值。我不知道
WebSocketId
进程如何处理
{text,…}
消息,因此我无法确切地告诉您该做什么。我看到了一个二进制错误列表