discord.js机器人代码运行报Unexpected token '?'错误如何解决
问题原因与修复方案
1. 报错核心原因
你遇到的Unexpected token '?'语法错误是因为代码里用到的**空值合并运算符(??)**是ES2020新增的语法,只有Node.js v14.0.0及以上版本才支持。而你安装的discord.js版本依赖该语法特性,Node版本过低就会无法识别该符号。
2. 额外需要修复的代码问题
你的代码本身还存在几处错误,即使升级Node版本也无法正常运行,需要同步修改:
- 初始化Discord Client实例时缺少
new关键字 - 未定义日志频道变量
CHANNEL - 昵称变更的日志输出逻辑存在多余加号的笔误
3. 具体操作步骤
步骤1:升级Node.js版本
安装Node.js v14.0.0以上的LTS版本,安装完成后在终端执行node -v确认版本符合要求即可。
步骤2:替换为修正后的代码
const Discord = require("discord.js"); // 修复1:添加new关键字初始化Client const bot = new Discord.Client(); // 修复2:填写你服务器里的日志频道名称 const CHANNEL = "你的日志频道名"; bot.on('guildMemberUpdate', function(oldMember, newMember) { //declare changes var Changes = { unknown: 0, addedRole: 1, removedRole: 2, username: 3, nickname: 4, avatar: 5 }; var change = Changes.unknown; //check if username changed if (newMember.user.username !== oldMember.user.username) change = Changes.username; //check if nickname changed if (newMember.nickname !== oldMember.nickname) change = Changes.nickname; //check if avatar changed if (newMember.user.displayAvatarURL() !== oldMember.user.displayAvatarURL()) change = Changes.avatar; //log to console switch (change) { case Changes.unknown: console.log('[' + newMember.guild.name + '][UPDUSR] ' + newMember.user.username + '#' + newMember.user.discriminator); break; case Changes.username: console.log('[' + newMember.guild.name + '][UPDUSRNM] ' + oldMember.user.username + '#' + oldMember.user.discriminator + ' is now ' + newMember.user.username + '#' + newMember.user.discriminator); break; case Changes.nickname: console.log('[' + newMember.guild.name + '][UPDUSRNK] ' + newMember.user.username + '#' + newMember.user.discriminator + (oldMember.nickname != null ? ' (' + oldMember.nickname + ')' : '') + (newMember.nickname != null ? ' is now ' + newMember.nickname : ' no longer has a nickname.')); break; case Changes.avatar: console.log('[' + newMember.guild.name + '][UPDAVT] ' + newMember.user.username + '#' + newMember.user.discriminator); break; } //post in the guild's log channel var log = newMember.guild.channels.cache.find(channel => channel.name === CHANNEL); if (log) { switch (change) { case Changes.unknown: log.send('**[User Update]** ' + newMember); break; case Changes.username: log.send('**[User Username Changed]** ' + newMember + ': Username changed from ' + oldMember.user.username + '#' + oldMember.user.discriminator + ' to ' + newMember.user.username + '#' + newMember.user.discriminator); break; case Changes.nickname: log.send('**[User Nickname Changed]** ' + newMember + ': ' + // 修复3:删除多余加号,修正输出逻辑 (oldMember.nickname != null ? 'Changed nickname from ' + oldMember.nickname : 'Set nickname') + ' to ' + (newMember.nickname != null ? newMember.nickname + '.' : 'original username.')); break; case Changes.avatar: log.send('**[User Avatar Changed]** ' + newMember); break; } } }); // 替换为你自己的机器人token bot.login("你的机器人token");
步骤3:配置机器人权限
确保你在Discord开发者后台给机器人开启了Server Members Intent权限,否则guildMemberUpdate事件无法正常触发。
内容的提问来源于stack exchange,提问作者Legend_recalls
相关产品推荐
相关产品推荐

