Erlang mod_花名册.erl中的错误记录

Erlang mod_花名册.erl中的错误记录,erlang,ejabberd,Erlang,Ejabberd,我正在尝试创建一个定制的mod_shared_花名册,这样它就可以将所有需要的vcard数据以JSON格式发送到客户机的XS字段中。我重新编写了从原始mod_shared_lotster.erl获取用户花名册的方法: 这很难理解,但在localhost上一切正常,但是当我在真正的服务器上加载beam文件时,我得到了错误。 有人能帮我吗?{badrecord,花名册}表示被视为记录的值实际上不是记录。看起来故障出现在基于行号的encode_item/1中,其中传入的项目被假定为花名册记录。必须将一

我正在尝试创建一个定制的mod_shared_花名册,这样它就可以将所有需要的vcard数据以JSON格式发送到客户机的XS字段中。我重新编写了从原始mod_shared_lotster.erl获取用户花名册的方法:

这很难理解,但在localhost上一切正常,但是当我在真正的服务器上加载beam文件时,我得到了错误。
有人能帮我吗?

{badrecord,花名册}
表示被视为记录的值实际上不是记录。看起来故障出现在基于行号的
encode_item/1
中,其中传入的项目被假定为花名册记录。必须将一个值传递给不是记录的函数。我不熟悉ejabberd,所以我可以提供更多的帮助来解释为什么会出现这种情况。我已经通过mod_annound解决了这项任务(通知所有用户vcard更改事件)
get_user_roster(Items, US) ->
    {U, S} = US,
    DisplayedGroups = get_user_displayed_groups(US),
    SRUsers = lists:foldl(fun (Group, Acc1) ->
              GroupName = get_group_name(S, Group),
              lists:foldl(fun (User, Acc2) ->
                          if User == US -> Acc2;
                         true ->
                             dict:append(User,
                                 GroupName,
                                 Acc2)
                          end
                      end,
                      Acc1, get_group_users(S, Group))
          end,
          dict:new(), DisplayedGroups),
{NewItems1, SRUsersRest} = lists:mapfoldl(fun (Item,
                       SRUsers1) ->
                          {_, _, {U1, S1, _}} =
                          Item#roster.usj,
                          US1 = {U1, S1},
                          case dict:find(US1,
                                 SRUsers1)
                          of
                        {ok, _GroupNames} ->
                            {Item#roster{subscription
                                     =
                                     both,
                                 ask =
                                     none},
                             dict:erase(US1,
                                SRUsers1)};
                        error ->
                            {Item, SRUsers1}
                          end
                      end,
                      SRUsers, Items),
SRItems = [#roster{usj = {U, S, {U1, S1, <<"">>}},
           us = US, jid = {U1, S1, <<"">>},
           name = get_rosteritem_name(U1, S1),
           subscription = both, ask = none, groups = GroupNames, xs = binary_to_list(get_rosteritem_data(U1, S1))}
       || {{U1, S1}, GroupNames} <- dict:to_list(SRUsersRest)],
SRItems ++ NewItems1.


get_rosteritem_data(U, S) ->
  case gen_mod:is_loaded(S, mod_vcard) of
    true ->
    SubEls = mod_vcard:get_vcard(U, S),
    get_rosteritem_data_vcard(SubEls);
    false ->
        <<"">>
end.

get_rosteritem_data_vcard(Vcard) ->
    Res = "{\"name\":\"",
Res2 = Res ++ binary_to_list(get_rosteritem_name_vcard(Vcard)),
Res3 = Res2 ++ "\",",
Res4 = Res3 ++ "\"nickname\":\"",
Res5 = Res4 ++ binary_to_list(get_rosteritem_nickname_vcard(Vcard)),
Res6 = Res5 ++ "\",",
Res7 = Res6 ++ "\"car_number\":\"",
Res8 = Res7 ++ binary_to_list(get_rosteritem_car_number_vcard(Vcard)),
Res9 = Res8 ++ "\",",
Res10 = Res9 ++ "\"lat\":\"",
Res11 = Res10 ++ binary_to_list(get_rosteritem_lat_vcard(Vcard)),
Res12 = Res11 ++ "\",",
Res13 = Res12 ++ "\"lon\":\"",
Res14 = Res13 ++ binary_to_list(get_rosteritem_lon_vcard(Vcard)),
Res15 = Res14 ++ "\"}",
JSON = list_to_binary(Res15),
?INFO_MSG("Roster json: ~p", [JSON]),
JSON.


get_rosteritem_name(U, S) ->
case gen_mod:is_loaded(S, mod_vcard) of
    true ->
    SubEls = mod_vcard:get_vcard(U, S),
    get_rosteritem_name_vcard(SubEls);
    false ->
        <<"">>
end.


get_rosteritem_name_vcard([Vcard|_]) ->
case fxml:get_path_s(Vcard,
        [{elem, <<"NAME">>}, cdata])
of
  <<"">> -> <<"">>;
  %Nick = fxml:get_path_s(Vcard, [{elem, <<"FN">>}, cdata]),
  %?INFO_MSG("Roster nick: ~p", [Nick]),
 % Nick; 
  Nickname -> Nickname,
      ?INFO_MSG("Roster NAME: ~p", [Nickname]),
          Nickname 
end;




get_rosteritem_name_vcard(_) ->
<<"">>.

get_rosteritem_nickname_vcard([Vcard|_]) ->
case fxml:get_path_s(Vcard,
        [{elem, <<"NICKNAME">>}, cdata])
of
  <<"">> -> <<"">>;
  %Nick = fxml:get_path_s(Vcard, [{elem, <<"FN">>}, cdata]),
  %?INFO_MSG("Roster nick: ~p", [Nick]),
  %Nick; 
  Nickname -> Nickname,
      ?INFO_MSG("Roster Nickname: ~p", [Nickname]),
          Nickname 
end;
get_rosteritem_nickname_vcard(_) ->
<<"">>.

get_rosteritem_car_number_vcard([Vcard|_]) ->
case fxml:get_path_s(Vcard,
        [{elem, <<"CAR_NUMBER">>}, cdata])
of
  <<"">> -> <<"">>;
  Nickname -> Nickname,
      ?INFO_MSG("Roster CAR_NUMBER: ~p", [Nickname]),
          Nickname 
end;

get_rosteritem_car_number_vcard(_) ->
<<"">>.

get_rosteritem_lat_vcard([Vcard|_]) ->
case fxml:get_path_s(Vcard,
        [{elem, <<"LAT">>}, cdata])
of
  <<"">> -> <<"">>;
  Nickname -> Nickname,
      ?INFO_MSG("Roster LAT: ~p", [Nickname]),
          Nickname 
end;
get_rosteritem_lat_vcard(_) ->
<<"">>.

get_rosteritem_lon_vcard([Vcard|_]) ->
case fxml:get_path_s(Vcard,
        [{elem, <<"LON">>}, cdata])
of
  <<"">> -> <<"">>;
  Nickname -> Nickname,
      ?INFO_MSG("Roster LON: ~p", [Nickname]),
          Nickname 
end;
get_rosteritem_lon_vcard(_) ->
<<"">>.
Roster json: <<"{\"name\":\"\",\"nickname\":\"\",\"car_number\":\"\",\"lat\":\"\....>>
failed to process roster get for ubuntu1@95.46.99.57: {error,{{badrecord,roster},[{mod_roster,encode_item,1,[{file,"src/mod_roster.erl"},{line,345}]},{lists,map,2,[{file,"lists.erl"},{line,1238}]},{mod_roster,process_iq_get,1,[{file,"src/mod_roster.erl"},{line,292}]}