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

Strapi中如何从控制器调用index.js的XMPP连接发送消息?

解决Strapi中从控制器调用XMPP发送消息的问题

问题根源

Strapi的src/index.js导出的对象只允许使用框架指定的键(比如register、bootstrap),直接添加自定义函数或对象会触发非法字段的报错,所以不能直接在这里定义XMPP相关的自定义内容。

解决方案:将XMPP实例挂载到Strapi全局对象

通过Strapi的bootstrap钩子初始化XMPP连接,然后把XMPP客户端实例挂载到strapi全局对象上,这样控制器就能直接调用该实例发送消息。

步骤1:修改index.js初始化XMPP并挂载

const { client } = require('@xmpp/client'); // 根据你使用的XMPP库调整

module.exports = {
  register(/*{ strapi }*/) {},
  bootstrap({ strapi }) {
    // 初始化XMPP客户端
    const xmppClient = client({
      service: 'xmpp://你的XMPP服务器地址:5222',
      username: '你的XMPP账号',
      password: '你的XMPP密码',
    });

    // 监听连接状态
    xmppClient.on('online', (jid) => {
      console.log('XMPP连接成功,JID:', jid.toString());
    });

    xmppClient.on('error', (err) => {
      console.error('XMPP连接出错:', err);
    });

    // 启动连接
    xmppClient.start().catch(console.error);

    // 将客户端挂载到strapi全局对象,供控制器调用
    strapi.xmppClient = xmppClient;
  },
};

步骤2:在carrefour.js控制器中调用XMPP发送消息

现在可以直接通过strapi.xmppClient访问XMPP实例,实现消息发送:

module.exports = {
  async sendXmppMsg(ctx) {
    try {
      const { targetJid, content } = ctx.request.body;

      // 检查XMPP客户端是否就绪
      if (!strapi.xmppClient) {
        return ctx.badRequest('XMPP客户端未初始化');
      }

      // 发送消息
      await strapi.xmppClient.send({
        type: 'chat',
        to: targetJid,
        body: content,
      });

      ctx.send({ status: 'success', msg: '消息已发送' });
    } catch (err) {
      ctx.badRequest('发送失败', err.message);
    }
  },
};

额外建议

  • 如果XMPP操作逻辑复杂,建议封装成Strapi服务(在carrefour/services/下创建服务文件),再让控制器调用服务,代码更易维护。
  • 记得添加XMPP连接断开后的重连逻辑,避免服务中断后控制器调用失败。

内容的提问来源于stack exchange,提问作者PépéMax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:55:15