2013-02-21 56 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中的示例。