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

Discord.js v14报错:TypeError: Cannot read properties of undefined (reading 'get')

Discord.js v14 中 Cannot read properties of undefined (reading 'get') 错误解决方法

问题场景

使用Discord.js v14开发机器人时,触发presenceUpdate事件时出现以下错误:

TypeError: Cannot read properties of undefined (reading 'get')
    at Object.execute (C:\Users\john\Desktop\RastaFam discord bot\Events\twitch.js:17:53)
    at Client.<anonymous> (C:\Users\john\Desktop\RastaFam discord bot\Handlers\eventHandler.js:23:59)
    at Client.emit (node:events:512:28)
    at PresenceUpdateAction.handle (C:\Users\john\Desktop\RastaFam discord bot\node_modules\discord.js\src\client\actions\PresenceUpdate.js:37:19)
    at module.exports [as PRESENCE_UPDATE] (C:\Users\john\Desktop\RastaFam discord bot\node_modules\discord.js\src\client\websocket\handlers\PRESENCE_UPDATE.js:4:33)
    at WebSocketManager.handlePacket (C:\Users\john\Desktop\RastaFam discord bot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:352:31)
    at WebSocketShard.onPacket (C:\Users\john\Desktop\RastaFam discord bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:494:22)
    at WebSocketShard.onMessage (C:\Users\john\Desktop\RastaFam discord bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:328:10)
    at callListener (C:\Users\john\Desktop\RastaFam discord bot\node_modules\ws\lib\event-target.js:290:14)
    at WebSocket.onMessage (C:\Users\john\Desktop\RastaFam discord bot\node_modules\ws\lib\event-target.js:209:9)

使用模块导出结构时触发错误,直接运行代码无此问题。原代码如下:

const { EmbedBuilder} = require('discord.js');

isstreaming = false;

module.exports = {
    name: "presenceUpdate",
    async execute(newPresence, client) {
        if (isstreaming === false) {
            if (newPresence.user.id === '151762679659233280') {
                const stream = newPresence.activities.find((activity) => activity.type === 1 && activity.name === 'Twitch');
                if (stream) {
                    const twitchEmbed = new EmbedBuilder()
                        .setTitle(`${newPresence.user.username} is now live on Twitch!`)
                        .setColor('#6441A5')
                        .setDescription(`${stream.details}

Watch now: ${stream.url}`);
                    
                    const channel = client.channels.get('1092538530879787160')
                    channel.send({ embeds: [twitchEmbed] })
                    isstreaming = true;
                }
            }
        }
        if (newPresence.user.id === '151762679659233280') {
            const notstream = newPresence.activities.find((activity) => activity.type === 0);
            if (notstream) {
                isstreaming = false;
            }
        }
    }
}

错误原因

  1. 参数顺序错误:presenceUpdate事件的默认参数顺序是(oldPresence, newPresence),你的execute函数把client放在第二个参数位置,导致client未被正确传入,最终client.channels为undefined。
  2. API方法过时:Discord.js v14中已移除channels.get()方法,需改用缓存获取或异步获取方式。
  3. 全局变量未声明:isstreaming未用let/const声明,会污染全局作用域。
  4. 硬编码类型值:直接用数字1、0表示活动类型,可读性差且易出错,v14推荐使用ActivityType枚举。

修复步骤

  1. 修正参数传递:确保execute函数能正确拿到client实例,调整参数顺序为(client, oldPresence, newPresence),同时修改事件处理程序调用时的传参逻辑;
  2. 替换过时方法:将client.channels.get()改为client.channels.cache.get()(从缓存获取)或client.channels.fetch()(异步获取,适用于缓存中不存在的频道);
  3. 声明变量作用域:用let声明isstreaming,限制其作用域;
  4. 使用枚举类型:导入ActivityType枚举,替换硬编码的数字类型值。

完整修正代码

const { EmbedBuilder, ActivityType } = require('discord.js');

let isstreaming = false;

module.exports = {
    name: "presenceUpdate",
    // 调整参数顺序,确保client被正确传入
    async execute(client, oldPresence, newPresence) {
        if (!isstreaming) {
            if (newPresence.user?.id === '151762679659233280') {
                // 使用ActivityType枚举替代数字
                const stream = newPresence.activities.find(activity => 
                    activity.type === ActivityType.Streaming && activity.name === 'Twitch'
                );
                if (stream) {
                    const twitchEmbed = new EmbedBuilder()
                        .setTitle(`${newPresence.user.username} 正在Twitch直播!`)
                        .setColor('#6441A5')
                        .setDescription(`${stream.details}\n\n立即观看:${stream.url}`);
                    
                    // 改用缓存获取频道,或用fetch异步获取
                    const channel = client.channels.cache.get('1092538530879787160');
                    if (channel) {
                        await channel.send({ embeds: [twitchEmbed] });
                        isstreaming = true;
                    }
                }
            }
        }
        if (newPresence.user?.id === '151762679659233280') {
            const notStreaming = newPresence.activities.find(activity => 
                activity.type === ActivityType.Playing
            );
            if (notStreaming) {
                isstreaming = false;
            }
        }
    }
}

额外注意事项

  • 确保事件处理程序(eventHandler.js)调用execute时,第一个参数传递client实例,例如:
    // eventHandler.js中的调用逻辑示例
    event.execute(client, ...args);
    
  • 使用channels.fetch()时需用异步处理,因为是网络请求:
    const channel = await client.channels.fetch('1092538530879787160');
    
  • 添加可选链操作符?.避免newPresence.user为undefined时的错误。

内容的提问来源于stack exchange,提问作者John nielsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:42:16