Discord机器人kick命令报错:Cannot read properties of undefined (FLAGS)
执行Discord机器人的kick命令时触发如下错误:
TypeError: 无法读取未定义的属性(读取'FLAGS')
在 handleKickCommand (/home/runner/VPL-BOT/index.js:246:45)
在 Client. (/home/runner/VPL-BOT/index.js:189:11)
在 Client.emit (node:events:513:28)
在 Client.emit (node:domain:489:12)
在 InteractionCreateAction.handle (/home/runner/VPL-BOT/node_modules/discord.js/src/client/actions/InteractionCreate.js:97:12)
在 module.exports [as INTERACTION_CREATE] (/home/runner/VPL-BOT/node_modules/discord.js/src/client/websocket/handlers/INTERACTION_CREATE.js:4:36)
在 WebSocketManager.handlePacket (/home/runner/VPL-BOT/node_modules/discord.js/src/client/websocket/WebSocketManager.js:354:31)
在 WebSocketManager. (/home/runner/VPL-BOT/node_modules/discord.js/src/client/websocket/WebSocketManager.js:238:12)
在 WebSocketManager.emit (/home/runner/VPL-BOT/node_modules/@vladfrangu/async_event_emitter/dist/index.js:282:31)
在 Client实例上触发'error'事件:
在 emitUnhandledRejectionOrErr (node:events:394:10)
对应的命令处理代码:
async function handleKickCommand(interaction) { const userOption = interaction.options.getUser("user"); const reasonOption = interaction.options.getString("reason"); if (!userOption) { return interaction.reply("请指定需要踢出的用户。"); } const userToKick = interaction.guild.members.cache.get(userOption.id); if (!userToKick) { return interaction.reply("在服务器中未找到该用户。"); } const member = interaction.guild.members.cache.get(interaction.user.id); if (!member.permissions.has(Permissions.FLAGS.KICK_MEMBERS)) { return interaction.reply('您没有执行"kick"命令的权限。'); } try { await userToKick.kick(reasonOption || "无理由。"); await interaction.reply(`已踢出用户 ${userToKick.user.tag}。`); } catch (error) { console.error(error); await interaction.reply('执行"kick"命令时发生错误。'); } }
问题原因
报错核心是**Permissions对象未正确导入/引用**,且Discord.js v13及以上版本已废弃Permissions.FLAGS的写法,改用新的权限常量结构。
修复步骤
正确导入权限模块
根据你的模块系统选择对应导入方式:- CommonJS(require语法):
const { PermissionsBitField } = require('discord.js'); - ES模块(import语法):
import { PermissionsBitField } from 'discord.js';
- CommonJS(require语法):
替换权限常量引用
将代码中Permissions.FLAGS.KICK_MEMBERS替换为PermissionsBitField.Flags.KICK_MEMBERS:if (!member.permissions.has(PermissionsBitField.Flags.KICK_MEMBERS)) { return interaction.reply('您没有执行"kick"命令的权限。'); }优化成员获取逻辑
不需要从缓存中手动获取当前交互用户的成员对象,直接使用interaction.member即可:// 替换原代码中的成员获取行 const member = interaction.member;
内容的提问来源于stack exchange,提问作者triiducc

