Discord.js命令昨日正常运行今报错Cannot read property 'id' of undefined如何修复
报错原因
- 报错指向的
member.id读取失败,是因为message.mentions.users.first()返回了undefined。当你运行这条test命令时没有@任何用户的情况下,就会出现这个问题。 - 即使你@了用户仍出现报错,可能是discord.js服务器成员缓存未命中,但该场景出现概率极低,核心问题还是你的代码缺少参数校验逻辑。
修复步骤
- 先添加参数校验,无提及用户时直接返回提示,终止后续逻辑执行
- 可以直接用
message.mentions.members.first()获取服务器成员对象,省略通过用户ID再查成员缓存的冗余步骤 - 补充角色不存在的兜底校验:你当前代码中角色创建是异步操作,创建完成前
roleOne/roleTwo仍为undefined,后续读取二者的id属性时会触发同类报错,需要同步处理。
修复后代码示例
const { Permissions } = require('discord.js') module.exports = { name: 'test', description: "A test command", async execute(client, message, args) { // 新增:校验是否有提及用户 const memberTarget = message.mentions.members.first(); if (!memberTarget) { return message.channel.send("请@你要查询的用户"); } // 处理角色逻辑,改成异步等待创建完成 let roleOne = message.guild.roles.cache.find(role => role.name === "Role Name 1") if (!roleOne) { roleOne = await message.guild.roles.create({ data: { name: "Role Name 1", color: "#FF8CC5", permissions: [Permissions.FLAGS.MANAGE_MESSAGES] } }); } const roleTwo = message.guild.roles.cache.find(role => role.name === "Role Name 2") // 新增:校验角色2是否存在 if (!roleTwo) { return message.channel.send("Role Name 2 不存在,请先创建该角色"); } if (!memberTarget.roles.cache.has(roleOne.id)) { if (!memberTarget.roles.cache.has(roleTwo.id)) { message.channel.send("This member doesn't have either role!") } else { message.channel.send("This member has Role Two") } } else { message.channel.send("This member has Role One") } } }
补充说明
你之前代码可以正常运行是因为当时运行命令时都正确@了用户,没有触发无参数的边界场景,不属于discord.js版本更新导致的兼容性问题。
内容的提问来源于stack exchange,提问作者Pepega Pingu
相关产品推荐
相关产品推荐

