Discord.js开发工具机器人时出现ReferenceError: member未定义问题问询
错误修复方案
1. 核心报错(ReferenceError: member is not defined)修复
你代码中自行声明的member变量和报错指向的member不是同一个,报错来源于第一行权限判断中对msg.member的访问:
- 只有服务器频道内触发的消息才会携带
msg.member属性,私信场景下触发命令时msg对象不存在member属性,直接访问就会抛出未定义错误 - 修复方案:在函数最开头加一层服务器场景判断:
if(!msg.guild) return msg.reply('该命令只能在服务器内使用')
2. 其他隐藏BUG修复
导入语句错误
当前第一行导入写法错误,discord.js没有导出Discord对象,会导致后续创建Embed时报错,两种写法二选一即可:
- 全量导入:
const Discord = require("discord.js");
- 按需解构导入(性能更优):
const { MessageEmbed } = require("discord.js"); // 后续创建Embed直接写new MessageEmbed()即可,不需要加Discord前缀
提及用户获取错误
msg.mentions.user.first()属性名拼写错误,正确为复数形式users,修改为:
var user = msg.mentions.users.first() || msg.guild.members.cache.get(args[0]);
变量名拼写错误
你定义的日志Embed变量名为log,发送时写成了logs多了一个s,会抛出变量未定义错误,修改为:
channel.send(log);
权限方法适配(discord.js v13+版本)
新版本discord.js已经废弃hasPermission方法,统一使用permissions.has,修改两处权限判断:
// 原用户权限判断修改为 if(!msg.member.permissions.has('BAN_MEMBERS')) // 原目标用户权限判断修改为 if(member.permissions.has('MANAGE_MESSAGES'))
逻辑不一致修复
原日志Embed描述写的是has been kicked,但实际执行的是封禁操作,描述和实际行为不符,建议统一修改为封禁相关描述。
修复后完整代码
// 按需导入为例 const { MessageEmbed } = require("discord.js"); exports.run = async(client, msg, args) => { // 前置判断:仅服务器内可用 if(!msg.guild) return msg.reply('该命令只能在服务器内使用') if(!msg.member.permissions.has('BAN_MEMBERS')) return msg.reply('你没有使用该命令的权限!') var user = msg.mentions.users.first() || msg.guild.members.cache.get(args[0]); if(!user) return msg.reply('你没有指定要封禁的用户!') var member; try { member = await msg.guild.members.fetch(user) } catch(err) { member = null; } if(member){ if(member.permissions.has('MANAGE_MESSAGES')) return msg.reply('你不能封禁其他管理组成员!'); } var reason = args.splice(1).join(' '); if(!reason) return msg.reply('请指定封禁该用户的理由!') var channel = msg.guild.channels.cache.find(c => c.name === 'mod-logs'); var verify = msg.guild.emojis.cache.find(emoji => emoji.name === 'white_check_mark') var log = new MessageEmbed() .setColor('0xecd776') .setDescription(`${verify} ${user} 已被 ${msg.author} 封禁,理由为:"**${reason}**"`) channel.send(log); var userLog = new MessageEmbed() .setColor('0xecd776') .setDescription(`你已被移出服务器,如有异议可联系管理组申诉。`) try { await user.send(userLog); } catch(err) { console.warn(err); } msg.guild.members.ban(user); var confir = new MessageEmbed() .setColor('0xecd776') .setDescription(`${verify} ${user} 已被 ${msg.author} 封禁,理由为:"**${reason}**"`) msg.channel.send(confir); msg.delete(); }
内容的提问来源于stack exchange,提问作者slooth
相关产品推荐
相关产品推荐

