Discord.js v14消息收集器报错:无法读取undefined的'id'属性
问题分析与解决
错误原因
- 消息属性误用:Discord.js v14中,
Message对象的发送者属性是author而非user,user属于交互类对象(如ChatInputCommandInteraction),所以m.user会返回undefined,读取id时自然抛出错误。 - 权限判断未终止流程:用户无权限时,代码仅回复提示但未停止后续逻辑,仍会创建消息收集器,可能引发额外异常。
- 未处理异常场景:收集器可能捕获到系统消息或机器人自身的回复,且未监听收集器的
error事件,导致未捕获的错误直接抛出。
修复后的代码
const { Message, Client, EmbedBuilder } = require('discord.js') module.exports = { name: 'dm', description: 'DMs someone with a role or a user.', run: async (client, message, args) => { // 权限校验:无权限则回复并终止流程 if(!message.member?.roles.cache.has('insertroleid')) { const embed = new EmbedBuilder() .setColor('DarkRed') .setDescription('You cannot use this command yet as you aren\'t a Presidential Team member yet!') await message.reply({ embeds: [ embed ] }) return } // 正确的过滤器:使用author属性,过滤机器人消息,兼容异常消息 const filter = m => { if (m.author.bot) return false; return m.author?.id === message.author.id; } const mcollector = message.channel.createMessageCollector({ filter, time: 120000, max: 1, maxProcessed: 1, errors: ['time'] }) const startEmbed = new EmbedBuilder() .setColor(process.env.embed_color) .setDescription('Hello, please start proceeding pinging the role you want to send.') await message.reply({ embeds: [ startEmbed ] }) mcollector.on('collect', async mc1 => { const content = mc1.content console.log(content) }) // 监听收集器错误,避免程序崩溃 mcollector.on('error', error => { console.error('消息收集器异常:', error) }) } }
关键修复点
- 权限校验优化:添加
return终止无权限用户的后续流程,用可选链?.避免message.member为undefined时(如DM场景)的报错。 - 过滤器修正:改用
m.author.id,添加机器人消息过滤逻辑,并用可选链?.确保m.author存在时再读取id,规避异常消息导致的错误。 - 错误事件处理:监听收集器的
error事件,捕获并处理异常,防止程序因未捕获错误崩溃。
内容的提问来源于stack exchange,提问作者JustAGuuy
相关产品推荐
相关产品推荐

