Discord.js机器人向所有加入服务器各发一条消息代码无响应如何解决
问题排查与修复方案
原有代码的核心问题
- 作用域内未传入
client变量:你在命令模块的execute函数内直接使用client,但没有在函数参数中接收命令处理器传入的客户端实例,导致代码静默失败无输出。 - 消息发送目标错误:原有逻辑中
message.channel.send()是将所有服务器的信息都发送到你触发命令的当前频道,完全没有实现给每个服务器单独发消息的需求。 - 未做频道权限过滤:没有筛选机器人有权限发送消息的文本频道,即便逻辑正确也大概率出现发送失败的情况。
修复后符合module.exports规范的代码
const { MessageEmbed } = require('discord.js'); // 如果你使用discord.js v14及以上版本,将上面的导入替换为: // const { EmbedBuilder } = require('@discordjs/builders'); module.exports = { name: "informacja", aliases: [], description: "向所有服务器发送通知", // 注意:这里的参数顺序要和你的命令处理器传参顺序匹配,大部分命令处理器会先传client再传message async execute(client, message) { // 遍历所有机器人加入的服务器 for (const guild of client.guilds.cache.values()) { try { // 筛选服务器内第一个机器人有权限发消息、发嵌入的文本频道 const targetChannel = guild.channels.cache.find( channel => // v13版本文本频道类型为'GUILD_TEXT',v14版本为'GuildText',注意对应修改 channel.type === 'GUILD_TEXT' && channel.permissionsFor(guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS']) ); // 没有符合条件的频道就跳过当前服务器 if (!targetChannel) continue; // 构造要发送的Embed // v14版本将MessageEmbed替换为EmbedBuilder即可,方法调用规则一致 const notifyEmbed = new MessageEmbed() .setTitle('通知标题') .setDescription('你要发送的通知内容') .setColor('Blue'); // 给当前服务器的目标频道发消息 await targetChannel.send({ embeds: [notifyEmbed] }); // 可选:加1秒延迟避免触发Discord速率限制,服务器数量多的话建议加上 // await new Promise(resolve => setTimeout(resolve, 1000)); } catch (err) { console.log(`向服务器 ${guild.name} 发送消息失败:`, err); } } // 全部发送完成后给触发命令的用户反馈 await message.reply('已尝试向所有服务器发送通知'); } };
额外注意事项
- 如果你的命令处理器传参顺序是先传
message再传client,请自行调整execute函数的参数顺序。 - 批量发送消息容易触发Discord的反垃圾机制,服务器数量较多的情况下建议添加发送间隔。
- 确保你的机器人开启了
SERVER MEMBERS INTENT等必要的权限开关。
内容的提问来源于stack exchange,提问作者wolfie00
相关产品推荐
相关产品推荐

