Erlang Module Hook 上的 ejabberd 2.1.11 错误 [关闭]

Posted

技术标签:

【中文标题】Erlang Module Hook 上的 ejabberd 2.1.11 错误 [关闭]【英文标题】:ejabberd 2.1.11 error on Erlang Module Hook [closed] 【发布时间】:2013-02-21 17:31:57 【问题描述】:

我一步一步地按照这篇文章,我似乎是唯一得到这个特定错误的人。 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 编译代码。

【问题讨论】:

是否值得再次打开此问题,因为 legoscia 已对其进行编辑以遵守指南 【参考方案1】:

这是该博客文章中的相关代码:

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

【讨论】:

以上是关于Erlang Module Hook 上的 ejabberd 2.1.11 错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

8.异常_EJa

Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?

php #module实现了hook_form_alter

Drupal 7 模块开发 建立模块帮助信息(hook_help)

erlang和餐饮哲学家的并发[重复]

[React Testing] Test your Custom Hook Module with react-hooks-testing-library