0

我一步一步地按照这篇文章,我似乎是唯一一个得到这个特定错误的人。 http://jasonrowe.com/2011/12/30/ejabberd-offline-messages/comment-page-1/#comment-2274

  • 我创建并编译了 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","johan@zspc-10"}],
                       [{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.

如果有任何帮助,我正在 Windows 7 电脑上运行 ejabberd 2.1.11 并使用 erlang R14B04 编译代码。

4

1 回答 1

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",则评估第一个子句,否则,如果匹配_(通配符匹配),则评估第二个子句。另请参阅此问题中的示例。

于 2013-02-21T17:46:09.423 回答