Converse.js自动发送消息实现求助:sendMessage触发器及$msg调用失败问题
在Converse.js中实现自动发送消息的正确方法
我来帮你搞定Converse.js自动发消息的问题,你的两次尝试都有一些细节没处理对,咱们来逐一修正:
先说说你之前代码的问题
第一种方法(sendMessage触发器)的问题
你用_converse.api.trigger('sendMessage', ...)的思路不对,sendMessage是Converse内部用来通知消息已发送的事件,不是用来主动调用发送消息的API。而且chatbox参数需要传入实际的聊天框实例,而不是类型_converse.ChatBox | _converse.ChatRoom。另外,initialize方法执行时Converse可能还没完全初始化完成,直接调用会找不到对应的聊天资源。
第二种方法($msg报错)的问题
报错Cannot read properties of undefined (reading '$msg')是因为在initialize阶段,_converse.env还没被正确初始化挂载。而且_converse.send也不是发送消息的正确方式,Converse要求通过对应的聊天框实例来发送消息,直接调用全局send方法是无效的。
正确的实现代码
下面是可以正常工作的示例,核心是等待Converse初始化完成,获取到实际的聊天框实例后再发送消息:
export const msgUser = (viewerChannelCredentials: any) => { const { username, channel } = viewerChannelCredentials; window.converse.plugins.add('msg-user', { dependencies: [], initialize: function () { const _converse = this._converse; // 等待Converse完全初始化并完成登录 _converse.api.listen.on('login', async () => { let chatbox; try { // 判断是私聊还是群组聊天,获取对应的聊天框 if (channel?.includes('@conference.')) { // 群组聊天:先获取或创建聊天室实例 chatbox = await _converse.api.chatrooms.get(channel); // 如果还没加入群组,先加入 if (!chatbox.get('joined')) { await chatbox.join(); } } else { // 私聊:获取或创建私聊聊天框 chatbox = await _converse.api.chatboxes.get(username); } if (chatbox) { // 发送消息 await chatbox.sendMessage('abc'); console.log('消息发送成功'); } else { console.error('无法找到对应的聊天框,请检查用户名/频道是否正确'); } } catch (error) { console.error('发送消息失败:', error); } }); }, }); };
关键注意点
- 等待初始化/登录完成:一定要在Converse完成初始化和登录后再执行发送逻辑,这里用
login事件确保用户已经登录,避免因未登录导致发送失败。 - 正确获取聊天框实例:私聊用
_converse.api.chatboxes.get(),群组用_converse.api.chatrooms.get(),如果聊天框不存在,Converse会自动创建。 - 群组需先加入:如果是发送到群组,要确保已经加入该群组,否则消息无法发送成功,代码里加了
chatbox.join()的逻辑。 - 使用实例的sendMessage方法:发送消息必须通过聊天框实例的
sendMessage方法,这是Converse官方推荐的方式。
内容的提问来源于stack exchange,提问作者Anik Ahmed fathe
相关产品推荐
相关产品推荐

