Discord bot运行时报TypeError: Cannot read property 'get' of undefined求解
问题根因
message.js中新建了独立的Discord.Client实例,没有挂载commands集合,和主文件中加载了所有命令的客户端不是同一个对象,因此访问client.commands返回undefined,调用get方法自然报错。- 主文件未导入
fs模块,读取目录文件时会直接抛出未定义错误。 - 主文件重复注册了
message事件处理逻辑,和加载的message.js事件处理冲突,属于冗余代码。
修复步骤
1. 修复主文件(main.js)
首先在文件顶部补充fs模块导入,删除重复的config引入:
const fs = require('fs'); const Discord = require('discord.js'); const {prefix, token} = require('./config.json'); const client = new Discord.Client(); client.commands = new Discord.Collection();
然后删除主文件中手动编写的整块client.on('message', message => { ... })逻辑,你已经通过事件加载机制处理message事件,不需要重复注册。
修改事件绑定逻辑,将当前客户端实例作为参数传入事件的execute方法:
const eventFiles = fs.readdirSync('./events').filter(file => file.endsWith('.js')); for (const file of eventFiles) { const event = require(`./events/${file}`); if (event.once) { client.once(event.name, (...args) => event.execute(...args, client)); } else { client.on(event.name, (...args) => event.execute(...args, client)); } };
2. 修复message.js
删除第一行新建客户端的代码,修改execute方法接收主文件传入的client实例:
const prefix = 'p!'; module.exports = { name: 'message', execute(message, client) { console.log(`${message.author.tag} in #${message.channel.name} sent: ${message.content}`); if(!message.content.startsWith(prefix) || message.author.bot) return; const args = message.content.slice(prefix.length).split(/ +/); const command = args.shift().toLowerCase(); if (command === 'ping'){ client.commands.get('ping').execute(message, args); } else if (command === 'help'){ client.commands.get('trick').execute(message, args); } } };
验证
修改完成后重启bot,发送p!ping即可正常返回pong。
内容的提问来源于stack exchange,提问作者pastawithrocks
相关产品推荐
相关产品推荐

