2016-03-15 3 views
1

я добавил настраиваемый модуль с именем mod_confirm_delivery в ejabberd, который компилируется и успешно добавлен, но когда я посылаю сообщение об ошибке приходит в моем журнале ошибки ejabberd, а именно:Как разрешить UNDEF ошибки в ejabberd крюке

2016-03-15 17:03:38.306 [error] <0.2653.0>@ejabberd_hooks:run_fold1:368 {undef,[{mod_confirm_delivery,send_packet,[{xmlel,<<"iq">>,[{<<"xml:lang">>,<<"en">>},{<<"type">>,<<"get">>},{<<"id">>,<<"aacfa">>}],[{xmlcdata,<<"\n">>},{xmlel,<<"query">>,[{<<"xmlns">>,<<"jabber:iq:roster">>}],[]},{xmlcdata,<<"\n">>}]},{state,{socket_state,gen_tcp,#Port<0.58993>,<0.2652.0>},ejabberd_socket,#Ref<0.0.1.25301>,false,<<"12664578908237388886">>,undefined,c2s,c2s_shaper,false,false,false,false,[verify_none,compression_none],true,{jid,<<"test1">>,<<"localhost">>,<<"D-5">>,<<"test1">>,<<"localhost">>,<<"D-5">>},<<"test1">>,<<"localhost">>,<<"D-5">>,{{1458,41617,630679},<0.2653.0>},{2,{{<<"test2">>,<<"localhost">>,<<>>},{{<<"test1">>,<<"localhost">>,<<>>},nil,nil},nil}},{2,{{<<"test2">>,<<"localhost">>,<<>>},{{<<"test1">>,<<"localhost">>,<<>>},nil,nil},nil}},{0,nil},undefined,undefined,{userlist,none,[],false},c2s,ejabberd_auth_internal,{{127,0,0,1},41928},[],active,[],inactive,undefined,undefined,1000,undefined,300,300,false,0,0,true,<<"en">>},{jid,<<"test1">>,<<"localhost">>,<<"D-5">>,<<"test1">>,<<"localhost">>,<<"D-5">>},{jid,<<"test1">>,<<"localhost">>,<<>>,<<"test1">>,<<"localhost">>,<<>>}],[]},{ejabberd_hooks,safe_apply,3,[{file,"src/ejabberd_hooks.erl"},{line,382}]},{ejabberd_hooks,run_fold1,4,[{file,"src/ejabberd_hooks.erl"},{line,365}]},{ejabberd_c2s,session_established2,2,[{file,"src/ejabberd_c2s.erl"},{line,1268}]},{p1_fsm,handle_msg,10,[{file,"src/p1_fsm.erl"},{line,582}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,240}]}]} 

у меня есть ejabberd 16.02.26 и мой модуль код: mod_confirm_delivery.erl

Этот модуль работает отлично с ejabberd 2.1.13, но я хочу модернизировал свой ejabberd. Я не могу понять, в чем проблема, и как я могу устранить эту ошибку.

ответ

1

undef error означает, что функция или модуль не найдены. Наиболее вероятная ошибка заключается в том, что файл mod_confirm_delivery.beam не находится в пути Erlang VM.

Вы должны попытаться переместить файл скомпилированного луча с другими файлами лучей ejabberd или попробовать установить путь, используемый для запуска Erlang, в каталог, в котором находится ваш файл mod_confirm_delivery.beam. Это опция -pa для Erlang VM.

Если ваш код, если в правильном месте, другой вариант - функция не определена. Крючок пытается позвонить mod_confirm_delivery:send_packet/4. Ваш код неправильный, поскольку он действительно не определен send_packet/4, но только send_packet/3. Вам необходимо обновить свой код, чтобы соответствовать новой подписи для user_send_packet крючка:

user_send_packet(Packet, C2SState, From, To) -> Packet 

В случае возникновения сомнений, вы можете обратиться к официальному списку крюка в ejabberd документации: https://docs.ejabberd.im/developer/hooks/

+0

Привета Микаэль, спасибо за ответ. Я проверил каталог **/lib/ejabberd/ebin/**, здесь ** mod_confirm_delivery.beam ** присутствует с другими файлами луча. Я что-то пропустил или должен проверить другой каталог. –

+0

Я обновил свой ответ для случая, когда undef применяется к функции. Вам необходимо обновить код в соответствии с последней подписью user_send_packet (см. Обновленный ответ). –

+0

Привет, Микаэль, я изменил подпись. Теперь mod_confirm_delivery в порядке, но я получил еще одну ошибку в ** ejabberd_sm.erl **, то есть: –