DiscordJS v14 封禁斜杠命令报错:Cannot read properties of null
DiscordJS v14 封禁斜杠命令 TypeError 排查与修复
问题根源
你遇到的 TypeError: Cannot read properties of null (reading 'username') 是因为使用了 interaction.options.getUser('target') 获取目标对象:
getUser()返回的是全局Discord用户对象,如果目标用户不在当前服务器中(比如已退出服务器),该方法会返回null。- 封禁操作仅对服务器内的成员有效,需要获取**服务器成员对象(GuildMember)**而非全局用户对象。
修复方案
1. 替换对象获取方式
将 getUser 改为 getMember,确保获取到服务器内的成员对象:
// 错误写法 const target = interaction.options.getUser('target'); // 正确写法 const target = interaction.options.getMember('target');
2. 调整用户名读取逻辑
GuildMember 对象的用户名存储在 user 属性下,或者使用 displayName 获取用户在服务器内的昵称(更友好):
// 使用用户名 `已封禁 ${target.user.username}` // 使用服务器昵称 `已封禁 ${target.displayName}`
3. 补充实际封禁逻辑
原代码仅回复提示,未执行真正的封禁操作,需添加 ban 调用:
await target.ban({ reason });
修改后的完整代码
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js'); const Logger = require('@utils/Logger'); module.exports = { data: new SlashCommandBuilder() .setName('ban') .setDescription('选择一个成员并封禁他们。') .addUserOption(option => option .setName('target') .setDescription('要封禁的成员') .setRequired(true)) .addStringOption(option => option .setName('reason') .setDescription('封禁原因')) .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers) .setDMPermission(false), async execute(interaction) { try { const target = interaction.options.getMember('target'); const reason = interaction.options.getString('reason') ?? '未提供原因'; // 执行封禁操作 await target.ban({ reason }); await interaction.reply(`已封禁 ${target.displayName},原因:${reason}`); } catch (error) { Logger.error(error); await interaction.reply({ content: '执行命令时发生错误,请联系开发者处理。', ephemeral: true, }); } }, };
额外检查项
- 确保机器人账号在当前服务器拥有Ban Members权限,否则执行封禁会抛出权限错误。
- 命令已正确注册到Discord服务器(可通过重新部署命令确认)。
内容的提问来源于stack exchange,提问作者TheUnium
相关产品推荐
相关产品推荐

