Discord机器人加入消息配置故障:用户名显示undefined求助
解决Discord机器人成员加入消息显示undefined的问题
看起来你遇到的问题主要是Discord.js版本迭代带来的API变化,再加上几个小的参数/属性调用错误,我帮你一步步修正:
问题根源
- 事件参数冗余:
guildMemberAdd事件只接收一个参数——guildMember对象,你写的channel和message参数是无效的,会被直接忽略。 - 用户名属性路径错误:在Discord.js v12及以后的版本中,用户的用户名并不直接挂载在
guildMember对象上,而是嵌套在guildMember.user子对象里,直接调用guildMember.username自然会返回undefined。 - 旧API方法失效:
addRole()、RichEmbed、channels.get()这些都是Discord.js v11及更早版本的写法,在新版本中已经被废弃或替换。
修正后的完整代码
// 确保你已经正确导入discord.js核心模块 const { Client, MessageEmbed } = require('discord.js'); const bot = new Client(); bot.on('guildMemberAdd', (guildMember) => { // 1. 更新角色查找与添加逻辑,兼容新版本API const targetRole = guildMember.guild.roles.cache.find(role => role.name === "ew"); if (targetRole) { // 先判断角色是否存在,避免因角色名称错误导致崩溃 guildMember.roles.add(targetRole); } // 2. 使用MessageEmbed替代旧的RichEmbed,并正确获取用户名 const embed = new MessageEmbed() .setTitle("User Join Notification") .setDescription(`${guildMember.user.username} has joined this server.`) // 可选:如果想显示用户的服务器昵称,替换成下面这行 // .setDescription(`${guildMember.displayName} has joined this server.`) .setColor("#21a1e1"); // 3. 更新频道获取逻辑,兼容新版本的缓存机制 const welcomeChannel = guildMember.guild.channels.cache.get('430681100956991511'); if (welcomeChannel) { // 先判断频道是否存在再发送消息 welcomeChannel.send({ embeds: [embed] }); // v13+版本发送embed需要放在embeds数组中 } });
关键修改点说明
- 用户名获取:用
guildMember.user.username获取用户的全局用户名,或者用guildMember.displayName获取用户在当前服务器的自定义昵称(体验更友好)。 - 角色操作:新版本中角色集合需要通过
cache属性访问,添加角色使用roles.add()方法,增加存在性判断可以避免不必要的报错。 - Embed构造:
RichEmbed在v12之后被MessageEmbed取代,v13及以后版本发送embed需要传入{ embeds: [embed] }作为参数。 - 频道获取:同样需要通过
cache属性访问频道集合,提前判断频道存在性能提升机器人的稳定性。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

