在尝试从数据包中获取 id 时出现此错误?

while trying to get id from packet getting this error?

我有 ejabberd 15.07 并在尝试从数据包获取 id 时使用 mod_ack 模块出现此错误?

return_message_reciept_to_sender(From, _To, Packet) ->
    ReturnRecieptType = "serverreceipt",
    MessageId = xml:get_tag_attr_s(<<"id">>, Packet),
    ?INFO_MSG("mod_echo_receipt - MsgID: ~p To: ~p From: ~p", [MessageId, _To, From]),
    send_message(From, _To, ReturnRecieptType, MessageId).

错误日志:

[错误] <0.437.0>@ejabberd_hooks:run_fold1:371 {function_clause,[{xml,get_tag_attr_s,[< <"id">>,{jid,<<"xxxxxx">>,<<"xxxxxx">>,<<>>,<<"xxxxxx">>,<<"xxxxxx" >>,<<>>}],[{file,"src/xml.erl"},{line,210}]},{mod_ack,return_message_reciept_to_sender,3,[{file,"src/mod_ack.erl"},{line,36}]},{mod_ack,on_user_send_packet,4,[{file,"src/mod_ack.erl"},{line,30}]},{ejabberd_hooks,safe_apply,3,[{文件,"src/ejabberd_hooks.erl"},{行,385}]},{ejabberd_hooks,run_fold1,4,[{文件, "src/ejabberd_hooks.erl"},{line,368}]},{ejabberd_c2s,session_established2,2,[{file,"src/ejabberd_c2s.erl"},{line,1296}]},{ p1_fsm,handle_msg,10,[{file,"src/p1_fsm.erl"},{line,582}]},{proc_lib,init_p_do_apply,3,[{文件,"proc_lib.erl"},{行,237}]}]}

source on github显示:

-spec(get_tag_attr_s/2 ::
(
  AttrName :: binary(),
  Xmlel    :: xmlel())
    -> binary()
).

get_tag_attr_s(AttrName, #xmlel{attrs = Attrs}) ->
    get_attr_s(AttrName, Attrs).

如果第二个参数 不是 一个 xmlel 记录,模式匹配将失败,您将得到 function_clause 错误。

您正在传递 7 元组而不是正确的记录。如果你想建立自己的记录通过,你将必须匹配xml.hrl中记录的定义:

-record(xmlel,
{
    name = <<"">> :: binary(),
    attrs    = [] :: [attr()],
    children = [] :: [xmlel() | cdata()]
}).

-type(cdata() :: {xmlcdata, CData::binary()}).

-type(attr() :: {Name::binary(), Value::binary()}).

-type(xmlel() :: #xmlel{}).

如果 your other question 中的代码正在调用此函数,您可能需要更改 on_user_send_packet 的参数顺序以匹配 ejabberd 挂钩。