Discord.js如何调用服务器昵称而非用户名?
获取Discord机器人中用户的服务器专属昵称
你需要通过服务器成员(Guild Member)对象来获取用户的服务器专属昵称,而不是直接使用全局用户对象。以下是适配你现有代码的修改方案:
修正后的完整代码
bot.on('message', function (user, userID, channelID, message, evt) { if (message.substring(0, 1) == '!') { var args = message.substring(1).split(' '); var cmd = args[0]; args = args.splice(1); switch(cmd) { case 'ping': // 获取触发命令的频道对象 const channel = bot.channels.get(channelID); // 默认使用用户全局用户名 let userNickname = user.username; // 仅在服务器频道内尝试获取专属昵称 if (channel.guild) { // 获取频道所属的服务器实例 const guild = channel.guild; // 获取用户在该服务器的成员对象 const member = guild.members.get(userID); // 如果存在服务器昵称则替换默认值 if (member && member.nickname) { userNickname = member.nickname; } } bot.sendMessage({ to: channelID, message: `Pong! was returned to user with nickname ${userNickname}` }); break; } } });
核心逻辑解释
- 获取服务器上下文:通过
bot.channels.get(channelID)拿到命令触发的频道,再通过channel.guild获取该频道所属的服务器,这是获取服务器专属信息的前提。 - 获取成员对象:
guild.members.get(userID)会返回用户在当前服务器的成员实例,这个对象里包含了服务器专属的昵称、角色等信息。 - 昵称回退处理:如果用户没有设置过服务器专属昵称,
member.nickname会返回null,这时我们就回退使用用户的全局用户名user.username。 - 兼容DM场景:如果命令是在私信频道触发的,
channel.guild会是undefined,代码会直接使用全局用户名,避免报错。
额外注意点
- 确保你的机器人拥有
GUILD_MEMBERS权限,否则可能无法正常获取成员对象的信息。 - 如果你后续升级到Discord.js v12+版本,API会有一些变化(比如
get()方法改为fetch()),但当前方案完全适配你现有的代码结构。
内容的提问来源于stack exchange,提问作者Simon Emil
相关产品推荐
相关产品推荐

