You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:39:23