开发Discord机器人时报TypeError: Cannot read property 'forEach' of undefined
问题定位
报错Cannot read property 'forEach' of undefined的核心原因是你代码中的guild变量不是有效的Discord服务器对象,导致guild.members返回undefined,无法调用遍历方法。具体错误点如下:
- 错误行
var guild = client.guilds.cache.get;中,get是需要传入服务器ID参数才能调用的集合方法,你没有添加调用括号、也没有传入参数,直接把方法本身赋值给了guild变量 - Discord.js v12及以上版本中,成员、角色都属于缓存集合,不能直接遍历
guild.members、也不能直接调用roles.has()判断角色 roles.has()方法需要传入角色ID,不能直接传角色名称
修复方案
直接通过消息上下文获取当前服务器对象,补全集合访问逻辑即可,修正后代码如下:
client.on("message", message => { // 过滤机器人自身消息避免死循环 if (message.author.bot) return; if (message.content.startsWith(prefix + "amstronglikeabullinapool")) { message.channel.send("ok i dont care") // 直接获取当前消息所属的服务器对象,不需要手动调用get方法 const guild = message.guild; // 校验是否在服务器环境内触发命令 if (!guild) return message.channel.send("该命令仅可在服务器内使用"); // 遍历服务器缓存的成员列表 guild.members.cache.forEach(member => { // 先查找名称为Member的角色 const targetRole = guild.roles.cache.find(role => role.name === "Member"); // 判断成员是否持有对应角色 if (targetRole && member.roles.cache.has(targetRole.id)) { member.kick() } }) } })
注意事项
- 该功能属于高危操作,建议添加管理员权限校验,避免普通用户调用造成服务器成员损失
- 如果服务器成员较多没有全量缓存,需要先开启Discord开发者后台的服务器成员意图,或者调用
guild.members.fetch()拉取全量成员后再操作
内容的提问来源于stack exchange,提问作者eduleaoel
相关产品推荐
相关产品推荐

