Discord机器人报错:UnhandledPromiseRejectionWarning无法读取undefined的'id'属性
问题分析与解决办法
这个错误很典型——你尝试访问pUser.id的时候,pUser是undefined,所以才会抛出Cannot read property 'id' of undefined的类型错误。咱们从你的代码片段入手,拆解问题:
核心问题来源
你的代码里获取用户的逻辑是:
let pUser = message.guild.member(message.mentions.users.first()) || message.guild.members.get(args[0]);
这条语句会在两种情况下返回undefined:
- 用户既没有@任何成员,输入的
args[0]也不是有效的用户ID,导致两个获取用户的方式都失败; - 如果你用的是Discord.js v12及以上版本,
message.guild.members.get()方法已经被移除了,改用异步的fetch(),直接用get()会返回undefined。
针对性解决步骤
1. 先添加存在性校验,避免undefined报错
不管哪种情况,先判断pUser是否存在,再执行后续逻辑:
let pUser = message.guild.member(message.mentions.users.first()) || message.guild.members.get(args[0]); // 先检查pUser是否有效 if (!pUser) { return message.reply("找不到指定用户!请确认你@了正确的成员,或者输入的用户ID是有效的。"); } // 确认pUser存在后再访问id let pCoins = userData[pUser.id].money;
2. 适配Discord.js新版本(如果是v12+)
如果你的Discord.js版本是v12或更高,members.get()已经被废弃,需要改用异步的fetch()方法,注意要把命令函数改成async:
// 假设这是你的命令处理函数,要加上async关键字 async function handleYourCommand(message, args) { let pUser = message.guild.member(message.mentions.users.first()); // 如果没有@用户,尝试通过ID获取 if (!pUser && args[0]) { try { pUser = await message.guild.members.fetch(args[0]); } catch (error) { return message.reply("无法通过该ID找到用户,请检查ID是否正确!"); } } // 再次校验 if (!pUser) { return message.reply("请@一个成员,或者提供有效的用户ID!"); } // 还要额外检查userData里是否有该用户的记录,避免后续访问money报错 if (!userData[pUser.id]) { // 初始化默认的用户数据 userData[pUser.id] = { money: 0 }; } let pCoins = userData[pUser.id].money; // 你的后续业务代码 }
3. 额外提醒:检查userData的初始化
如果userData里没有对应用户的ID记录,即使pUser有效,访问userData[pUser.id].money也会报错,所以一定要确保用户数据存在,或者在使用前初始化默认值,就像上面代码里那样。
如果按照上面的方法调整后还是有问题,建议提供更多代码细节,比如命令的完整逻辑、userData的初始化和存储方式,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者elm
相关产品推荐
相关产品推荐

