在尝试从数据包中获取 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}]}]}
-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 挂钩。
我有 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}]}]}
-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 挂钩。