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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:20:19