You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Tigase与xmpp.js注册XMPP用户成功但数据库无记录

XMPP注册异常:Tigase返回成功响应但数据库无用户记录

刚接触XMPP,使用Tigase服务器与xmpp.js库开发,其他功能正常,但注册新用户时,明明收到服务器返回的成功响应,搭配Tigase的外部MySQL数据库里却没有生成对应的用户记录。

我的代码

const xmpp = client({
  service: "ws://localhost:5290",
  domain: "8662d6b4746d",
});

xmpp.reconnect.stop()
xmpp.timeout = 5000

xmpp.on("online", async (address) => {
  console.log("Online!");
  await xmpp.iqCaller.request(
    xml('iq', {type: 'get', to: '8662d6b4746d'},
      xml('query', {xmlns: 'jabber:iq:register'})
    )
  );
  await xmpp.iqCaller.set(
    xml("query", {xmlns: "jabber:iq:register"},
      xml("username", {}, "username"),
      xml("password", {}, "password"),
      xml("email", {}, "email@email.com")
    ),
    '8662d6b4746d'
  )
});
xmpp.on("status", (status) => {
  console.debug(status);
});
xmpp.on("stanza", async (stanza) => {
  console.log(stanza.toString())
});
xmpp.start().catch(console.error);

第一个IQ请求的响应

<iq from="8662d6b4746d" id="e7t9y4ll60" to="ed0e2dd2-4701-4631-8d16-dfb16b29babf@8662d6b4746d/36525451-tigase-81"
    type="result" xmlns="jabber:client">
<query xmlns="jabber:iq:register">
  <instructions>Please provide the following information to sign up for an account

    Please also provide your e-mail address (must be valid!) to which we will send confirmation link.
  </instructions>
  <x type="form" xmlns="jabber:x:data">
    <title>Account Registration</title>
    <instructions>Please provide the following information to sign up for an account

      Please also provide your e-mail address (must be valid!) to which we will send confirmation link.
    </instructions>
    <field var="FORM_TYPE" type="hidden">
      <value>jabber:iq:register</value>
    </field>
    <field var="username" label="Username" type="text-single">
      <required/>
      <value></value>
    </field>
    <field var="password" label="Password" type="text-private">
      <required/>
      <value></value>
    </field>
    <field var="email" label="Email (MUST BE VALID!)" type="text-single">
      <required/>
      <value></value>
    </field>
  </x>
</query>
</iq>

发送的注册XML请求

<iq type="set" id="3peq9kolof" xmlns="jabber:client">
<query xmlns="jabber:iq:register">
  <username>user</username>
  <password>pass</password>
  <email>email@email.com</email>
</query>
</iq>

最终响应

<iq from="8662d6b4746d" id="qmfce9m3s4" to="ed0e2dd2-4701-4631-8d16-dfb16b29babf@8662d6b4746d/36525451-tigase-81" type="result" xmlns="jabber:client"/>

服务器流特性(显示支持注册)

<stream:features xmlns:stream="http://etherx.jabber.org/streams">
<sm xmlns="urn:xmpp:sm:3"/>
<register xmlns="http://jabber.org/features/iq-register"/>
<csi xmlns="urn:xmpp:csi:0"/>
<ver xmlns="urn:xmpp:features:rosterver"/>
<sub xmlns="urn:xmpp:features:pre-approval"/>
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
<session xmlns="urn:ietf:params:xml:ns:xmpp-session">
  <optional/>
</session>
<c node="https://tigase.net/tigase-xmpp-server" ver="DVBeLFh/TPj/59OCEybudilMhLM=" hash="SHA-1"
   xmlns="http://jabber.org/protocol/caps"/>
</stream:features>

问题分析与解决方案

核心问题:注册格式不匹配

从服务器返回的第一个IQ响应可以看到,Tigase要求使用XEP-0004数据表单格式提交注册信息,而不是传统的直接嵌套<username>/<password>节点的格式。虽然服务器返回了成功响应,但实际上因为格式不符合要求,没有执行用户创建逻辑。

修改后的注册代码

将注册请求改为表单格式:

xmpp.on("online", async (address) => {
  console.log("Online!");
  // 获取注册表单(可省略,直接构造表单提交)
  await xmpp.iqCaller.request(
    xml('iq', {type: 'get', to: '8662d6b4746d'},
      xml('query', {xmlns: 'jabber:iq:register'})
    )
  );
  // 用数据表单格式提交注册信息
  await xmpp.iqCaller.set(
    xml("iq", {type: 'set', to: '8662d6b4746d'},
      xml("query", {xmlns: "jabber:iq:register"},
        xml("x", {type: "submit", xmlns: "jabber:x:data"},
          xml("field", {var: "FORM_TYPE", type: "hidden"},
            xml("value", {}, "jabber:iq:register")
          ),
          xml("field", {var: "username"},
            xml("value", {}, "username")
          ),
          xml("field", {var: "password"},
            xml("value", {}, "password")
          ),
          xml("field", {var: "email"},
            xml("value", {}, "email@email.com")
          )
        )
      )
    )
  );
});

额外检查项

  1. Tigase邮箱验证配置:如果服务器开启了邮箱验证(响应中提示需发送确认链接),用户创建后会处于待激活状态,数据库中可能存在记录但标记为未激活,需检查users表的account_status字段。
  2. 数据库存储组件配置:确认Tigase已正确配置使用MySQL存储组件,检查config.tdsl中的'user-repository'配置是否指向MySQL。
  3. 服务器日志:查看Tigase的日志文件,搜索注册相关的错误信息,可能能找到未写入数据库的具体原因。

内容的提问来源于stack exchange,提问作者Gabbr Issimo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:40:28