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

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:

  1. 用户既没有@任何成员,输入的args[0]也不是有效的用户ID,导致两个获取用户的方式都失败;
  2. 如果你用的是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:47:06