2013-02-21 4 views
0

Я последовал за этой статьей шаг за шагом, и я, кажется, единственный человек, который получил эту конкретную ошибку. http://jasonrowe.com/2011/12/30/ejabberd-offline-messages/comment-page-1/#comment-2274ejabberd 2.1.11 ошибка на крюке модуля Erlang

  • Я создал и компилируется код Erlang.
  • Я добавил файл .beam в указанное место.
  • Я обновил файл ejabberd.cfg.

Но когда я посылаю автономный сообщение на сервер ejabberd я получаю следующее сообщение об ошибке в файле журнала:


=ERROR REPORT==== 2013-02-21 15:34:50 === 
E(<0.365.0>:ejabberd_hooks:294) : {if_clause, 
             [{mod_http_offline,create_message,3}, 
             {ejabberd_hooks,run1,3}, 
             {ejabberd_sm,route,3}, 
             {ejabberd_local,route,3}, 
             {ejabberd_router,route,3}, 
             {ejabberd_c2s,session_established2,2}, 
             {p1_fsm,handle_msg,10}, 
             {proc_lib,init_p_do_apply,3}]} 
running hook: {offline_message_hook, 
        [{jid,"test","zspc-10","Spark 2.6.3","test","zspc-10", 
         "Spark 2.6.3"}, 
        {jid,"johan","zspc-10",[],"johan","zspc-10",[]}, 
        {xmlelement,"message", 
         [{"id","4z5S1-69"},{"to","[email protected]"}], 
         [{xmlelement,"x", 
          [{"xmlns","jabber:x:event"}], 
          [{xmlelement,"composing",[],[]}]}]}]} 

Ошибка возникает в функции create_message. Вот как это выглядит:

create_message(_From, _To, Packet) -> 
     Type = xml:get_tag_attr_s("type", Packet), 
     FromS = xml:get_tag_attr_s("from", Packet), 
     ToS = xml:get_tag_attr_s("to", Packet), 
     Body = xml:get_path_s(Packet, [{elem, "body"}, cdata]), 
     if (Type == "chat") -> 
      post_offline_message(FromS, ToS, Body) 
     end. 

Если это любая помощь, я бегу ejabberd 2.1.11 на Windows 7 ПК и скомпилирован код с Erlang R14B04.

+0

Стоит ли снова открывать этот вопрос, так как legoscia отредактировал его, чтобы придерживаться рекомендаций –

ответ

4

Вот соответствующий фрагмент кода из этого сообщения в блоге:

create_message(_From, _To, Packet) -> 
     Type = xml:get_tag_attr_s("type", Packet), 
     FromS = xml:get_tag_attr_s("from", Packet), 
     ToS = xml:get_tag_attr_s("to", Packet), 
     Body = xml:get_path_s(Packet, [{elem, "body"}, cdata]), 
     if (Type == "chat") -> 
      post_offline_message(FromS, ToS, Body) 
     end. 

Вы получаете в if_clause ошибку, что означает, что ни один пункт из выражения if было правдой. Erlang, в отличие от многих других языков, требует, чтобы хотя бы одно из условий было истинным, иначе вы получите ошибку времени выполнения, как это.

Поэтому вопрос заключается в том, что код должен делать, когда Type не является "chat". Если это не должно просто ничего не делать, добавить предложение true:

 if (Type == "chat") -> 
      post_offline_message(FromS, ToS, Body); 
      true -> 
      ok 
     end. 

Или еще лучше, переписать его как выражение case. В Erlang выражения case встречаются гораздо чаще, чем выражения if.

 case Type of 
      "chat" -> 
      post_offline_message(FromS, ToS, Body); 
      _ -> 
      ok 
     end. 

То есть, если Type матчи "chat", оценить первое предложение, а в противном случае, если он соответствует _ (совпадение по шаблону), оценить второе положение. См. Также примеры в this question.

Смежные вопросы