discord.js报错Cannot read properties of undefined (reading 'get')
报错原因
这个类型错误的核心原因是:client.commands 属性根本没有被初始化,值为 undefined,自然无法调用其上的 .get() 方法。
discord.js 的 Client 实例默认不自带 commands 属性,这个属性是开发者用来统一存储命令的自定义挂载项。你的代码里既没有创建这个存储容器,也没有把写好的 kick.js 命令加载进来,直接调用 client.commands.get() 必然触发报错。
修复方法
按照以下步骤修改代码即可:
- 调整
main.js头部的依赖引入和客户端初始化逻辑,新增文件读取模块、初始化命令存储集合:
const Discord = require('discord.js'); const fs = require('fs'); // 引入node内置文件系统模块,用来读取本地命令文件 const client = new Discord.Client(); client.commands = new Discord.Collection(); // 挂载命令存储集合,discord的Collection和Map用法一致,适合存命令 const prefix = '?';
- 新建名为
commands的文件夹,把你写好的kick.js挪到这个文件夹里,方便后续管理多命令。在main.js的client.login()调用之前,添加命令加载逻辑,把所有命令文件注册到集合里:
// 读取commands文件夹下所有js格式的命令文件 const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js')); for (const file of commandFiles) { const command = require(`./commands/${file}`); // 以命令的name字段为key,把整个命令模块存到集合里 client.commands.set(command.name, command); }
如果你不想单独建commands文件夹,也可以直接在main.js里写两行直接加载kick命令:
const kickCommand = require('./kick.js'); client.commands.set(kickCommand.name, kickCommand);但分文件夹管理是多命令机器人的通用规范写法,后续加ban、mute等命令时不用改加载逻辑。
- (可选优化)给命令调用加一层存在校验,避免命令不存在时抛出错误,把原来的kick命令调用块改成:
if(command === 'kick') { const targetCommand = client.commands.get('kick'); if(!targetCommand) return message.reply('该命令不存在'); targetCommand.execute(message, args); }
额外逻辑补全建议
你当前的kick命令逻辑还有几个容易触发报错的遗漏点,建议补上:
- 执行命令的用户本身需要拥有服务器的
踢人权限,否则应该直接返回无权限提示 - 机器人需要被授予
KICK_MEMBERS权限,且角色位阶要高于被踢用户,否则调用.kick()会抛出API错误 - 要加参数校验,用户没@要踢的人时给出明确提示,而不是统一返回踢人失败
内容的提问来源于stack exchange,提问作者Shushan Arora
相关产品推荐
相关产品推荐

