Discord.js v14 presenceUpdate报错:Cannot read properties of null (reading 'includes')
解决Discord机器人presenceUpdate事件中的TypeError问题
问题描述
我开发Discord机器人时,想要实现:当用户状态描述包含.gg/slayde链接时为其添加指定角色,反之移除该角色。但运行代码时触发TypeError: Cannot read properties of null (reading 'includes')错误,原代码如下:
const { Client, GatewayIntentBits, Collection } = require('discord.js'); const config = require('./config'); const bot = new Client({ intents: [3276799] }); bot.commands = new Collection() require('./src/Structure//Handler/Event')(bot); require('./src/Structure//Handler/Command')(bot); bot.on('presenceUpdate', async (oldPresence, newPresence) => { const role = newPresence.guild.roles.cache.get("1048286446345261137"); const member = newPresence.member const activities = newPresence.activities[0]; if (activities && (activities.state.includes(".gg/slayde" ) || activities.state.includes(".gg/slayde"))) { return newPresence.member.roles.add(role) } else { if(member.roles.cache.get(role.id)) { newPresence.member.roles.remove(role) } } }) bot.login(config.clients.token);
错误原因
- 未校验
activities.state是否为null:用户的活动状态可能没有设置描述文本,此时activities.state为null,直接调用includes会触发空值读取错误 - 缺少核心对象的空值校验:
newPresence.member或目标角色可能不存在,后续操作会引发额外错误 - 冗余判断逻辑:代码中重复判断同一个链接条件,无实际意义
修复后的代码
const { Client, GatewayIntentBits, Collection } = require('discord.js'); const config = require('./config'); const bot = new Client({ intents: [3276799] }); bot.commands = new Collection() require('./src/Structure//Handler/Event')(bot); require('./src/Structure//Handler/Command')(bot); bot.on('presenceUpdate', async (oldPresence, newPresence) => { // 先校验核心对象是否存在 if (!newPresence.guild || !newPresence.member) return; const roleId = "1048286446345261137"; const role = newPresence.guild.roles.cache.get(roleId); // 角色不存在则直接退出 if (!role) return; const member = newPresence.member; const hasRole = member.roles.cache.has(roleId); const targetLink = ".gg/slayde"; // 检查活动状态是否包含目标链接 let hasTargetLink = false; if (newPresence.activities.length > 0) { const activity = newPresence.activities[0]; // 确保state存在再判断 if (activity.state && activity.state.includes(targetLink)) { hasTargetLink = true; } } // 根据结果添加/移除角色 if (hasTargetLink && !hasRole) { await member.roles.add(role); } else if (!hasTargetLink && hasRole) { await member.roles.remove(role); } }) bot.login(config.clients.token);
修复说明
- 增加了
newPresence.guild、newPresence.member、role的空值校验,避免无效操作 - 对
activity.state做了非空判断后再调用includes,彻底解决空值读取错误 - 优化逻辑:先判断用户是否已拥有角色,再执行添加/移除操作,减少冗余API调用
- 提取目标链接和角色ID为变量,便于后续维护
内容的提问来源于stack exchange,提问作者Mister Zlebia
相关产品推荐
相关产品推荐

