2013-02-21 18 views
0

我一步一步跟隨本文,我似乎是唯一得到這個特定錯誤的人。 http://jasonrowe.com/2011/12/30/ejabberd-offline-messages/comment-page-1/#comment-2274ejabberd 2.1.11 Erlang模塊鉤子上的錯誤

  • 我創建和編譯二郎代碼。
  • 我將.beam文件添加到指定的位置。
  • 我更新了ejabberd.cfg文件。

但是,當我發送離線消息到ejabberd服務器我得到下面的錯誤日誌文件:在create_message功能發生


=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(_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. 

如果它的任何幫助,我在Windows 7 PC上運行ejabberd 2.1.11和編譯二郎R14B04的代碼。

+0

是否值得再次開放這個問題,因爲legoscia已經編輯它來遵守指導原則 – 2014-09-30 15:45:47

回答

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中的示例。