Erlang Ejabberd自定义IQ处理程序:获取功能未实现或服务不可用

Erlang Ejabberd自定义IQ处理程序:获取功能未实现或服务不可用,erlang,xmpp,ejabberd,Erlang,Xmpp,Ejabberd,我剥离了mod_last.erl以测试IQHandler的创建,只粘贴了重要的部分: start(Host, Opts) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, fun gen_iq_handler:check_type/1, one_queue), gen_iq_handler:add_iq_handler(ejabberd_local, Host,

我剥离了mod_last.erl以测试IQHandler的创建,只粘贴了重要的部分:

start(Host, Opts) ->
    IQDisc = gen_mod:get_opt(iqdisc, Opts, fun gen_iq_handler:check_type/1,
                             one_queue),
    gen_iq_handler:add_iq_handler(ejabberd_local, Host,
                  <<"join">>, ?MODULE, process_local_iq, IQDisc).

stop(Host) ->
    gen_iq_handler:remove_iq_handler(ejabberd_local, Host,
                     <<"join">>).

process_local_iq(_From, _To,
         #iq{type = Type, sub_el = SubEl} = IQ) ->
    case Type of
      set ->
      IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
      get ->
      Sec = 60,
      IQ#iq{type = result,
        sub_el =
            [#xmlel{name = <<"query">>,
                attrs =
                [{<<"xmlns">>, <<"join">>},
                 {<<"seconds">>,
                  iolist_to_binary(integer_to_list(Sec))}],
                children = []}]}
    end.
但当我发出请求时:

<iq type='get' id='123'>
    <query xmlns='join'/>
</iq>
我一直收到服务不可用错误:

A没有帮助,因为我没有添加


注意:我要创建的IQHandler是请求加入游戏室。

如果您发送一个没有to属性的IQ节,服务器将代表发送实体处理该节。在实践中,这意味着服务器会将节视为to属性是用户的裸JID,在本例中alfred@localhost.

当您调用gen_iq_handler:add_iq_handler来注册一个新的处理程序时,您还可以指定作用域,ejabberd_local或ejabberd_sm代表会话管理器。如果是ejabberd_local,处理程序将对发往服务器本身的IQ节做出反应,在本例中为localhost。如果是ejabberd_sm,处理程序将对针对本地用户的赤裸裸JID的IQ节做出反应,例如:。alfred@localhost.


所以这就是为什么你的IQ节最终没有被处理。发送请求时包含to=localhost,或者注册处理程序时将ejabberd_local更改为ejabberd_sm。

就是这样,当我尝试使用to时,我给出了完整的JID,因此当然不会工作,因为资源无法处理Iq。也终于明白了本地和sm处理程序之间的区别,谢谢!你能帮帮我吗
<iq from='alfred@localhost' to='alfred@localhost/Alfreds-MacBook-Pro' type='error' id='123'>
<query xmlns='join'/>
<error code='503' type='cancel'>
    <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>