Discord.js V14升级后出现TypeError与ReferenceError问题求助
Discord.js v14升级后两个错误的修复方案
错误1:TypeError: Cannot read properties of null (reading 'member')
原因:
- Discord.js v14中,
PresenceUpdate事件的newPresence对象可能因用户不在服务器缓存、隐私设置限制等情况,导致member属性为null,你直接读取newPresence.member未做前置判断。 - 事件回调参数顺序错误:v14里
PresenceUpdate的回调参数是(oldPresence, newPresence),你只接收了newPresence,可能导致变量对应错误。
- Discord.js v14中,
修复:
- 先判断
newPresence存在且newPresence.member不为null再执行后续逻辑。 - 修正事件回调的参数顺序,确保获取正确的
newPresence对象。
- 先判断
错误2:ReferenceError: config is not defined
- 原因:你提供的代码里未使用
config,但项目中其他模块大概率仍在引用config变量却未正确导入;或是你之前用config模块读取配置,升级后切换到process.env但未清理残留代码。需检查所有引用config的文件,要么替换为process.env,要么正确导入配置模块。
代码中的其他问题及修复
除上述两个错误,你的代码还有多处语法和逻辑问题,一并修正:
- 错误使用类而非实例:反复写
GuildMember.activities,GuildMember是类,应使用实例newPresence的activities属性,即newPresence.activities。 - if语句缺失花括号:部分if判断后未加
{},导致代码作用域混乱,触发语法错误。 - 消息发送方式错误:
client.channels.cache.get(process.env.VanityChannel)后直接调用reply,reply是消息对象的方法,此处应调用send方法发送消息。 - execute函数未接收client参数:v14事件处理的
execute函数通常需要接收client作为第一个参数,否则client会显示未定义。 - Embed未定义:
removedEmbed和addedEmbed未在代码中定义,需确保这些Embed对象已正确创建。
修正后的完整代码
const { Events, EmbedBuilder } = require('discord.js'); // 定义示例Embed,可根据需求修改内容 const removedEmbed = new EmbedBuilder() .setTitle('专属角色已移除') .setColor('#ff0000') .setDescription('用户不再展示指定自定义状态,已移除对应角色'); const addedEmbed = new EmbedBuilder() .setTitle('专属角色已添加') .setColor('#00ff00') .setDescription('用户展示了指定自定义状态,已添加对应角色'); module.exports = { name: Events.PresenceUpdate, async execute(client, oldPresence, newPresence) { // 修正参数顺序,加入client try { // 前置判断避免空值报错 if (!newPresence) return; const newMember = newPresence.member; if (!newMember || newMember.user.bot) return; if (!newMember.guild || newMember.guild.id !== process.env.GuildID) return; // 提取重复判断逻辑,简化代码 const hasVanityRole = newMember.roles.cache.has(process.env.VanityRole); const hasVanityActivity = newPresence.activities.some(activity => activity.type === "CUSTOM" && activity.state && activity.state.includes(process.env.VanityPhrase) ); // 移除角色逻辑 if (hasVanityRole && !hasVanityActivity) { const role = newMember.guild.roles.cache.get(process.env.VanityRole); if (!role) return; // 确保角色存在再操作 await newMember.roles.remove(role); const vanityChannel = client.channels.cache.get(process.env.VanityChannel); if (vanityChannel) { await vanityChannel.send({ content: `<@${newMember.id}>`, embeds: [removedEmbed], allowedMentions: { parse: [] }, }); } } // 添加角色逻辑 if (!hasVanityRole && hasVanityActivity) { await newMember.roles.add(process.env.VanityRole); const vanityChannel = client.channels.cache.get(process.env.VanityChannel); if (vanityChannel) { await vanityChannel.send({ content: `<@${newMember.id}>`, embeds: [addedEmbed], }); } } } catch (error) { console.error(error); } } }
内容的提问来源于stack exchange,提问作者catto
相关产品推荐
相关产品推荐

