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; } } } }
错误原因
- 参数顺序错误:
presenceUpdate事件的默认参数顺序是(oldPresence, newPresence),你的execute函数把client放在第二个参数位置,导致client未被正确传入,最终client.channels为undefined。 - API方法过时:Discord.js v14中已移除
channels.get()方法,需改用缓存获取或异步获取方式。 - 全局变量未声明:
isstreaming未用let/const声明,会污染全局作用域。 - 硬编码类型值:直接用数字1、0表示活动类型,可读性差且易出错,v14推荐使用
ActivityType枚举。
修复步骤
- 修正参数传递:确保
execute函数能正确拿到client实例,调整参数顺序为(client, oldPresence, newPresence),同时修改事件处理程序调用时的传参逻辑; - 替换过时方法:将
client.channels.get()改为client.channels.cache.get()(从缓存获取)或client.channels.fetch()(异步获取,适用于缓存中不存在的频道); - 声明变量作用域:用
let声明isstreaming,限制其作用域; - 使用枚举类型:导入
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
相关产品推荐
相关产品推荐

