Discord机器人日志开发报错:TypeError读取get属性失败
问题分析与解决
核心错误原因
你遇到的TypeError: Cannot read properties of undefined (reading 'get'),根源是事件处理函数的参数顺序错误。在Discord.js的MessageCreate事件中,execute函数的第一个参数应该是消息对象(msg),第二个才是客户端实例(client),但你的代码把顺序写反了,导致client变量实际指向的是消息对象——而消息对象没有channels属性,调用client.channels.cache.get()自然会触发读取undefined属性的错误。
修复后的完整代码
const { Events } = require("discord.js"); module.exports = { name: Events.MessageCreate, // 修正参数顺序:先msg,后client execute(msg, client) { // 可选:过滤机器人消息,避免日志循环 if (msg.author.bot) return; const logChannelId = '1035536575200768010'; // 用fetch替代cache.get,确保能获取到频道(缓存可能未加载) client.channels.fetch(logChannelId) .then(channel => { if (msg.attachments.size > 0) { // 遍历所有附件,无需转JSON msg.attachments.forEach(() => { // 修正频道ID的获取:消息的channelId,不是用户的 channel.send(`${msg.author.username} 发送了图片,所在频道ID:${msg.channelId}`); }); } else if (msg.content.trim()) { channel.send(`${msg.author.username} 发送了消息:${msg.content}`); } }) .catch(err => { console.error('获取日志频道失败:', err); }); } }
关键优化说明
- 参数顺序修正:这是解决当前报错的核心,必须把
execute的参数改为(msg, client)。 - 频道获取方式优化:
cache.get()依赖本地缓存,若机器人刚启动或频道信息未缓存会失败;fetch()直接从Discord API拉取数据,可靠性更高。 - 附件处理优化:用
msg.attachments.size判断是否有附件,forEach遍历更简洁,无需手动转换JSON和循环索引。 - 数据修正:
msg.author是用户对象,没有channelId属性,消息的频道ID需从msg.channelId获取。 - 错误捕获:添加
catch块处理频道获取失败的情况,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Doggu
相关产品推荐
相关产品推荐

