You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord机器人加入消息配置故障:用户名显示undefined求助

解决Discord机器人成员加入消息显示undefined的问题

看起来你遇到的问题主要是Discord.js版本迭代带来的API变化,再加上几个小的参数/属性调用错误,我帮你一步步修正:

问题根源

  1. 事件参数冗余:guildMemberAdd事件只接收一个参数——guildMember对象,你写的channel和message参数是无效的,会被直接忽略。
  2. 用户名属性路径错误:在Discord.js v12及以后的版本中,用户的用户名并不直接挂载在guildMember对象上,而是嵌套在guildMember.user子对象里,直接调用guildMember.username自然会返回undefined。
  3. 旧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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:54:00