Discord欢迎机器人正常运行却未在指定频道发送欢迎消息的问题排查
故障原因与修复方案
- 核心触发问题:未开启Discord要求的特权意图,导致事件完全不执行
按照Discord当前的规则,机器人必须在开发者后台手动开启「服务器成员意图(Server Members Intent)」,否则guildMemberAdd事件完全不会触发。这也是你仅能看到登录成功提示、没有任何报错的最常见原因。找到你机器人应用的Bot设置页,下拉到特权意图区域打开对应开关保存即可。 - 依赖版本过旧,全量使用已废弃的旧API
你当前的代码基于早已停止维护的discord.js v11及更早版本编写,所有核心方法现在都已不可用,首先需要执行npm install discord.js@latest把依赖升级到最新稳定版,再对应调整API写法:- 频道获取:原写法
member.guild.channels.find("name","💬✦general")已废弃,当前需要从缓存取频道、用回调匹配,即member.guild.channels.cache.find(c => c.name === "💬✦general");更稳妥的方式是直接存目标频道ID,用member.guild.channels.cache.get("你的频道ID")获取,避免频道改名后功能失效 - 嵌入对象:原
new Discord.RichEmbed()已更改为new Discord.MessageEmbed() - 头像获取:原
member.user.avatarURL属性写法,现在是方法调用member.user.displayAvatarURL() - 发送嵌入:原
channel.sendEmbed(embed)已废弃,当前统一写法为channel.send({ embeds: [embed] })
- 频道获取:原写法
- 代码存在直接导致崩溃的语法/逻辑错误
- 嵌入消息的
addField方法必须传入2个必填参数(字段名、字段值),你写的.addField(':family_mwgb: | Luda zabava tek počinje')仅传了1个参数,运行时会直接抛异常,因为你没有加全局错误捕获,所以控制台没有输出对应报错。 - 字段参数错位:你写的
.addField("**[" +${member.id}+ "]**",'Pročitaj naša pravila u',"**[#📖✦pravila]**")中,第一个参数(字段名)误填为用户ID,正确的字段名应该填写类似「规则频道」的提示文字,否则嵌入显示逻辑会混乱。
- 嵌入消息的
- 冗余无效代码需要删除
事件回调外面单独写的let channel = member.guild.channels.find("name","💬✦general");这行完全无效,它所处的作用域没有定义member变量,运行时会直接报ReferenceError,直接删掉即可。 - 基础权限校验:确认机器人在目标欢迎频道拥有「发送消息」「嵌入链接」的权限,否则消息会被服务器权限策略拦截,无法成功发出。
修复后可直接运行的参考代码
// 替换成你自己的欢迎频道ID,不要用名字匹配 const WELCOME_CHANNEL_ID = "在这里填你的目标频道ID"; client.on('guildMemberAdd', member => { const channel = member.guild.channels.cache.get(WELCOME_CHANNEL_ID); // 频道不存在直接退出,避免报错 if (!channel) return; const memberAvatar = member.user.displayAvatarURL(); const embed = new Discord.MessageEmbed() .setColor('RANDOM') .setThumbnail(memberAvatar) .addField(':bust_in_silhouette: | Ime : ', `${member.user.tag}`) .addField(':microphone2: | Zdravo!', `Dobro došao u dolinu , ${member}`) .addField(':id: | User :', `**[${member.id}]**`) .addField('Pravila', 'Pročitaj naša pravila u', "**[#📖✦pravila]**", true) .addField(':family_mwgb: | Sada si član', `${member.guild.memberCount}`) .addField("Name", `<@${member.id}>`, true) .addField(':family_mwgb: | Luda zabava tek počinje', "Ovde ima dosta zabave i novih prijatelja!") .addField('Server', `${member.guild.name}`, true) .setFooter(`${member.guild.name}`) .setTimestamp() channel.send({ embeds: [embed] }); });
内容的提问来源于stack exchange,提问作者Aldin
相关产品推荐
相关产品推荐

