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 PCで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 は、他の多くの言語とは異なり、条件の少なくとも 1 つが true である必要があります。そうでない場合、このような実行時エラーが発生します

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"は最初の句を評価し、それ以外の場合_(ワイルドカード一致) は 2 番目の句を評価します。この質問の例も参照してください。

于 2013-02-21T17:46:09.423 に答える