2015-10-06 30 views
0

我有ejabberd 15.07和使用mod_ack模塊,同時試圖從數據包中獲取id獲取此錯誤?而試圖從數據包獲取此錯誤?

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」 >>,< < >>}],[{文件,「SRC/xml.erl 「},{線,210}]},{mod_ack,return_message_reciept_to_sender,3,[{文件,」 SRC/mod_ack.erl「},{1啉,36}]},{mod_ack,on_user_send_packet,4,[{文件, 「SRC/mod_ack.erl」},{線,30}]},{ejabberd_hooks,safe_apply,3,[{文件,「SRC/ejabberd_hooks .erl 「},{線,385}]},{ejabberd_hooks,run_fold1,4,[{文件,」 SRC/ejabberd_hooks.erl「},{線,368}]},{ejabberd_c2s,session_established2,2,[{文件, 「SRC/ejabberd_c2s.erl」},{線,1296}]},{p1_fsm,HANDLE_MSG,10,[{文件, 「SRC/p1_fsm.erl」},{線,582}]},{proc_lib, init_p_do_apply,3,[{文件, 「proc_lib.erl」},{線,237}]}]}

回答

2

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_cl錯誤。您正在傳遞一個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鉤子。

相關問題