DiscordJS:如何为机器人自身发送的消息创建Thread
解决Discord机器人无法为自身消息创建Thread的问题
看起来你现在的核心问题是:当前代码只给用户的原始消息创建了线程,但你实际想把线程绑定在机器人自己发送的嵌入回复上——而且你的逻辑其实不需要修改if(message.author.bot) return;这个判断,因为触发整个流程的是用户发起的消息。
先拆解你现有代码的问题:
- 你调用的
message.startThread()里的message是用户发的原始消息,之后你又删除了这条消息,不仅会让线程失去父消息(可能引发异常),也完全不符合你“为机器人自身消息创建线程”的需求。 - 你的异步逻辑用了
.then()嵌套,虽然能跑,但可读性差,也容易出现时序问题。
下面是调整后的代码,直接给机器人发送的嵌入回复创建线程:
client.on('messageCreate', async message => { if(message.author.bot) return; if(message.channel.id === config.suggestChannelID) { const suggestEmbed = new MessageEmbed() .setColor('#FEE75C') .setTitle(message.content) .setAuthor({ name: message.member.displayName, iconURL: '[REDACTED]', url: '[REDACTED]' }) .setTimestamp() .setFooter({ text: 'SuggestManager', iconURL: '[REDACTED]' }); // 先发送机器人的嵌入回复,拿到消息对象 const sentEmbed = await message.reply({ embeds: [suggestEmbed] }); // 给机器人自己的这条消息创建线程 const discussThread = await sentEmbed.startThread({ name: `讨论: ${message.content.substring(0, 20)}`, // 用建议内容前20字做线程名,更直观 autoArchiveDuration: 60, type: 'GUILD_PUBLIC_THREAD', reason: '为用户建议创建讨论线程' }); // 添加表情反应 await sentEmbed.react("👍"); await sentEmbed.react("👎"); // 删除用户的原始消息 await message.delete(); }; });
关键调整点说明:
- 线程绑定对象变更:不再给用户的原始消息创建线程,而是给机器人发送的
sentEmbed消息调用startThread(),这样线程就牢牢绑定在机器人的回复上了。 - 异步逻辑优化:把
.then()改成await写法,代码更易读,也能避免异步操作顺序混乱的问题。 - 线程名优化:用建议内容的前20字符作为线程名,比固定的
name更有辨识度,用户一眼就能知道线程对应的是哪个建议。 - 权限检查:确保你的机器人账号在目标频道拥有
CREATE_PUBLIC_THREADS、SEND_MESSAGES、MANAGE_MESSAGES这些必要权限,否则可能创建线程失败。
内容的提问来源于stack exchange,提问作者IAmAze
相关产品推荐
相关产品推荐

