Discord.js机器人获取带Rich Presence游戏状态报presence未定义怎么修复
问题核心原因
你遇到的报错本质是访问了不存在对象的属性,核心有三个触发场景:
- 调用指令时没有@有效用户,
message.mentions.members.first()返回undefined - 你的机器人未开启Presence权限,导致拉取不到被@用户的状态数据,
msgMention.presence为undefined - 带Rich Presence的游戏会生成多条活动记录,或者活动属性结构和普通游戏不一致,直接按下标取
activities[0]或者访问不存在的属性会报错
具体修改方案
你需要在所有层级的属性访问前加非空判断,推荐用ES6的可选链操作符简化写法,同时提前校验必填属性是否存在,修改后的代码如下:
const { Client, Intents } = require('discord.js'); module.exports = { name: 'test', aliases: [], category: 'test', utilisation: '', execute(client, message, presence, guild) { // 先判断是否有@用户 const msgMention = message.mentions.members.first() if (!msgMention) return message.channel.send('请@要查询的用户') // 加presence、activities非空判断 const presenceData = msgMention.presence if (!presenceData || !presenceData.activities?.length) return message.channel.send('未查询到该用户的当前活动') // 优先取类型为PLAYING的活动,避免Rich Presence生成的其他类型活动排在前面 const playingActivity = presenceData.activities.find(act => act.type === 'PLAYING' || act.name === 'Spotify') if (!playingActivity) return message.channel.send('该用户当前没有在玩游戏或收听Spotify') const mp = playingActivity if (mp.name === "Spotify"){ // 加assets属性非空判断 if (!mp.assets?.largeImage) return message.channel.send('未查询到该用户的Spotify播放信息') const imgvar = mp.assets.largeImage.replace('spotify:','') message.channel.send({ embed: { color: '1DB954', title: `${msgMention.displayName} 正在收听 ${mp.assets.largeText}`, image: { url: `https://i.scdn.co/image/${imgvar}` }, }, }); } else { // 加timestamps.start非空判断 if (!mp.timestamps?.start) return message.channel.send(`该用户正在玩 ${mp.name},但无法获取游玩时长`) const now = new Date(); const playTimeMs = Math.abs(now - mp.timestamps.start); const hours = (playTimeMs / 36e5).toFixed(2) // 保留原有的英雄联盟特殊文案分支 if (mp.name === "League of Legends") { return message.channel.send(`${msgMention.displayName} 已经在英雄联盟里浪费了 ${hours} 小时`); } message.channel.send(`${msgMention.displayName} 已经玩了 ${mp.name} ${hours} 小时`); } }, };
额外配置确认
你需要先去Discord开发者后台检查以下配置,否则依然可能拉取不到状态数据:
- 进入你的机器人应用页,找到「Bot」选项卡,开启
PRESENCE INTENT和SERVER MEMBERS INTENT开关 - 初始化Client的Intents里要添加
GUILD_PRESENCES、GUILD_MEMBERS权限项
内容的提问来源于stack exchange,提问作者Tachanks
相关产品推荐
相关产品推荐

