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
相关产品推荐
相关产品推荐

