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

Discord.js V14升级后出现TypeError与ReferenceError问题求助

Discord.js v14升级后两个错误的修复方案

错误1:TypeError: Cannot read properties of null (reading 'member')

  • 原因:

    1. Discord.js v14中,PresenceUpdate事件的newPresence对象可能因用户不在服务器缓存、隐私设置限制等情况,导致member属性为null,你直接读取newPresence.member未做前置判断。
    2. 事件回调参数顺序错误:v14里PresenceUpdate的回调参数是(oldPresence, newPresence),你只接收了newPresence,可能导致变量对应错误。
  • 修复:

    • 先判断newPresence存在且newPresence.member不为null再执行后续逻辑。
    • 修正事件回调的参数顺序,确保获取正确的newPresence对象。

错误2:ReferenceError: config is not defined

  • 原因:你提供的代码里未使用config,但项目中其他模块大概率仍在引用config变量却未正确导入;或是你之前用config模块读取配置,升级后切换到process.env但未清理残留代码。需检查所有引用config的文件,要么替换为process.env,要么正确导入配置模块。

代码中的其他问题及修复

除上述两个错误,你的代码还有多处语法和逻辑问题,一并修正:

  1. 错误使用类而非实例:反复写GuildMember.activities,GuildMember是类,应使用实例newPresence的activities属性,即newPresence.activities。
  2. if语句缺失花括号:部分if判断后未加{},导致代码作用域混乱,触发语法错误。
  3. 消息发送方式错误:client.channels.cache.get(process.env.VanityChannel)后直接调用reply,reply是消息对象的方法,此处应调用send方法发送消息。
  4. execute函数未接收client参数:v14事件处理的execute函数通常需要接收client作为第一个参数,否则client会显示未定义。
  5. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:20:34