discord.js编写userinfo命令触发SyntaxError: Unexpected identifier报错如何解决
错误原因
await关键字仅允许在标记了async的异步函数中使用,你代码中的execute函数未添加async声明,导致JS解析await时报非法标识符语法错误。- 代码存在额外隐含问题:
statuses、flags两个映射对象未定义,后续运行也会触发报错;离线用户无presence属性未做兼容,会触发读取属性报错;存在多余的未使用embed变量;require导入放在函数内不符合常规编码规范。
修复方法
- 给
execute函数添加async声明 - 补充缺失的映射对象,添加离线状态兼容逻辑,优化导入位置
- 完整修正后代码如下:
const moment = require('moment'); const Discord = require('discord.js'); // 补充缺失的状态映射 const statuses = { online: '在线', idle: '闲置', dnd: '请勿打扰', offline: '离线' }; // 补充缺失的徽章映射 const flags = { DISCORD_EMPLOYEE: 'Discord员工', PARTNERED_SERVER_OWNER: '合作服务器所有者', HYPESQUAD_EVENTS: 'HypeSquad活动成员', BUGHUNTER_LEVEL_1: 'Bug猎手1级', HOUSE_BRAVERY: 'HypeSquad勇气之屋', HOUSE_BRILLIANCE: 'HypeSquad智慧之屋', HOUSE_BALANCE: 'HypeSquad平衡之屋', EARLY_SUPPORTER: '早期支持者', TEAM_USER: '团队用户', BUGHUNTER_LEVEL_2: 'Bug猎手2级', VERIFIED_BOT: '认证机器人', EARLY_VERIFIED_BOT_DEVELOPER: '早期认证机器人开发者' }; module.exports = { name: "userinfo", description: "Userinfo of mentioned user/id or if no one mentioned then yours", async execute(client, msg, args, guild) { const member = msg.mentions.members.first() || msg.guild.members.cache.get(args[0]) || msg.member; if (!member) return msg.channel.send('Please mention the user for the userinfo..'); const userFlags = (await member.user.fetchFlags()).toArray(); const activities = []; let customStatus; // 增加presence为空的兼容判断,防止离线用户报错 if (member.presence) { for (const activity of member.presence.activities.values()) { switch (activity.type) { case 'PLAYING': activities.push(`Playing **${activity.name}**`); break; case 'LISTENING': if (member.user.bot) activities.push(`Listening to **${activity.name}**`); else activities.push(`Listening to **${activity.details}** by **${activity.state}**`); break; case 'WATCHING': activities.push(`Watching **${activity.name}**`); break; case 'STREAMING': activities.push(`Streaming **${activity.name}**`); break; case 'CUSTOM_STATUS': customStatus = activity.state; break; } } } const uiembed = new Discord.MessageEmbed() .setTitle(`${member.displayName}'s Information`) .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) .addField('User', member, true) .addField('Discriminator', `\`#${member.user.discriminator}\``, true) .addField('ID', `\`${member.id}\``, true) .addField('Status', member.presence ? statuses[member.presence.status] : '离线', true) .addField('Bot', `\`${member.user.bot}\``, true) .addField('Color Role', member.roles.color || '`None`', true) .addField('Highest Role', member.roles.highest, true) .addField('Joined server on', `\`${moment(member.joinedAt).format('MMM DD YYYY')}\``, true) .addField('Joined Discord on', `\`${moment(member.user.createdAt).format('MMM DD YYYY')}\``, true) .setFooter(msg.member.displayName, msg.author.displayAvatarURL({ dynamic: true })) .setTimestamp() .setColor(member.displayHexColor); if (activities.length > 0) uiembed.setDescription(activities.join('\n')); if (customStatus) uiembed.spliceFields(0, 0, { name: 'Custom Status', value: customStatus}); if (userFlags.length > 0) uiembed.addField('Badges', userFlags.map(flag => flags[flag]).join('\n')); msg.channel.send(uiembed); } }
注:以上代码适配discord.js v12/v13版本,若你使用v14及以上版本,
MessageEmbed导入、fetchFlags等API有调整,需要对应修改API调用方式。
内容的提问来源于stack exchange,提问作者Electro X
相关产品推荐
相关产品推荐

