Discord.js报错TypeError: Cannot read property 'has' of undefined 求助
错误原因
TypeError: Cannot read property 'has' of undefined的触发原因是:你代码中调用client.commands.has(command)、client.aliases.has(command)时,client.commands或者client.aliases为未定义状态,你没有在机器人初始化阶段给client对象挂载这两个集合。
修复方案
第一步:初始化挂载集合
在你的机器人入口文件(通常为index.js/main.js)中,初始化Client后添加集合挂载逻辑:
const { Client, Collection } = require('discord.js'); const client = new Client({ // 你的客户端配置,比如intents配置 intents: [/* 填写你需要的网关意图 */] }); // 挂载命令集合和别名集合 client.commands = new Collection(); client.aliases = new Collection();
第二步:添加命令加载逻辑
你需要读取所有命令文件,将命令和对应别名存入对应的集合中,参考逻辑如下:
const fs = require('fs'); // 假设所有命令文件都存放在./commands目录下 const commandFileList = fs.readdirSync('./commands').filter(file => file.endsWith('.js')); for (const file of commandFileList) { const command = require(`./commands/${file}`); // 存入命令集合,key为命令名 client.commands.set(command.config.name, command); // 遍历别名存入别名集合 command.config.aliases.forEach(alias => { client.aliases.set(alias, command.config.name); }); }
第三步(可选):添加防御判断
可以在你现有的命令处理代码中添加可选链判断,避免未初始化时触发报错:
let cmd; if (client.commands?.has(command)) { cmd = client.commands.get(command); } else if (client.aliases?.has(command)) { cmd = client.commands.get(client.aliases.get(command)); };
内容的提问来源于stack exchange,提问作者Kadir Göktaş
相关产品推荐
相关产品推荐

