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

Discord.js机器人报错TypeError:无法读取undefined的id属性求解决

解决Discord.js中"Cannot read property 'id' of undefined"的问题

嘿,我来帮你搞定这个报错!咱们先拆解一下问题出在哪:

你现在的代码里,第一行就直接写了var usertag = message.mentions.users.first().id;,这就意味着只要有任何消息触发message事件,程序都会尝试读取提到的第一个用户的id——但如果这条消息根本没有@任何用户(比如有人只是发了普通消息,或者命令格式不对没@人),message.mentions.users.first()就会是undefined,自然就会抛出"Cannot read property 'id' of undefined"的错误。

而且你判断命令的方式也有问题:你用message.content.startsWith(prefix + "awardmedal " + "The Copper Cross " + usertag),但实际用户输入的是/awardmedal The Copper Cross @用户名,这里的@用户对应的是用户的标签(比如@JohnDoe#1234),不是用户id,所以这个判断条件几乎永远不会成立,同时还提前触发了上面的报错。

修复步骤和代码示例

咱们调整一下逻辑顺序,先判断是不是目标命令,再检查有没有提到用户,最后处理权限和颁发操作:

var prefix = "/"
client.on('ready', () => { 
  console.log("ZiloBot Loaded"); 
});

client.on("message", (message) => {
  // 先判断消息是不是以目标命令开头
  if (message.content.startsWith(`${prefix}awardmedal The Copper Cross`)) {
    // 先获取提到的用户,并且做存在性检查
    const targetUser = message.mentions.users.first();
    if (!targetUser) {
      return message.channel.send("你需要@一个用户来颁发勋章哦!");
    }
    const usertag = targetUser.id;
    
    // 检查命令发起者是否在权限列表里
    if (sjw.includes(message.author.id)) {
      console.log(`Awarding Copper Cross to ${usertag}`);
      message.channel.send(`Awarding Copper Cross to <@${usertag}>`); // 用<@id>可以在Discord里@到用户
    } else {
      message.channel.send("你没有权限执行这个命令哦!");
    }
  }
});

client.login(mytokenissecret);

关键改进点

  • 先判断命令再处理用户提及:避免了非命令消息触发用户提及的读取操作,从根源上防止报错
  • 添加用户提及的存在性检查:如果用户没@人,会友好提示,而不是直接崩溃
  • 调整命令判断逻辑:只检查命令和勋章名的开头,不用拼接用户id,适配实际输入格式
  • 优化消息发送:用<@${usertag}>可以在Discord中正确@到目标用户,比直接发id更友好

这样调整后,你的机器人就不会再出现那个报错,而且命令逻辑也更符合用户的实际输入习惯啦!

内容的提问来源于stack exchange,提问作者Ovalandir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:33:31