运行Discord机器人ban命令报TypeError: args.slice(...).join is not a function求助
问题排查与修复方案
你触发的TypeError: args.slice(...).join is not a function报错核心原因及其他关联问题的修复方式如下:
核心报错原因
你定义的args变量写在module.exports.run函数外部,且没有作为参数传入run函数,函数执行时访问到的args不是你预期的消息分割后的数组,导致调用slice方法后返回值不是数组,自然没有join方法。
完整修复步骤
- 调整参数传递逻辑:你写在模块顶层的两行消息预处理代码不属于当前ban命令模块,移动到主文件的
message事件回调中,同时修改run函数的参数,接收预处理后的args:
// 主文件message事件中调用命令的逻辑参考 client.on('message', message => { if (!message.content.startsWith(prefix) || message.author.bot) return; let args = message.content.slice(prefix.length).split(' '); let command = args.shift().toLowerCase(); // 调用对应命令的run方法,传入args const commandFile = client.commands.get(command); if (commandFile) commandFile.run(client, message, args); })
- 修正ban命令模块的代码问题:
- 把
run函数的参数改为async (bot, message, args) - 原代码直接取
message.mentions.users.first().id会在无@用户时直接报错,且const定义的常量不能二次赋值,修改user变量的定义逻辑 - 变量名不统一:你定义的原因变量为
banReason,但后续判断、Embed中都用了不存在的reason变量,统一变量名 - 错误使用未定义的
msg变量,统一改为参数中的message - 如果你使用的是Discord.js v12及以上版本,需要调整成员获取、Embed的语法适配新版本
- 把
修复后的完整代码
module.exports.run = async (bot, message, args) => { // 初始化user变量,优先取@的用户 let user = message.mentions.users.first(); // 没有@用户时尝试用ID查 if (!user) { try { const targetMember = message.guild.members.cache.get(args[0]); if (!targetMember) throw new Error('查无此用户'); user = targetMember.user; } catch (error) { return message.reply('无法通过输入的ID找到对应Discord用户!'); } } // 提取封禁原因 const reason = args.slice(1).join(' '); // 权限校验逻辑 if (user.id === message.author.id) return message.channel.send('你不能封禁你自己😑'); if (!reason) return message.reply('你没有填写封禁原因!'); const targetMember = message.guild.members.cache.get(user.id); if (!targetMember.bannable) return message.reply('机器人权限不足,无法封禁该用户😂'); // 构造通知Embed const banConfirmationEmbedModlog = new Discord.MessageEmbed() .setAuthor(`封禁操作者:${message.author.username}#${message.author.discriminator}`, message.author.displayAvatarURL()) .setThumbnail(user.displayAvatarURL()) .setColor('RED') .setTimestamp() .setDescription(`**操作类型**:封禁 **目标用户**:${user.username}#${user.discriminator} (${user.id}) **封禁原因**:${reason}`); message.channel.send(banConfirmationEmbedModlog); // 补充实际执行封禁的逻辑 原代码漏了这步 await targetMember.ban({ reason: reason }); } module.exports.config = { name: "ban", description: "Ban those naughty folks", usage: ">ban <@用户/用户ID> <封禁原因>", accessableby: "Moderators and Admins", }
内容的提问来源于stack exchange,提问作者Alan ITD
相关产品推荐
相关产品推荐

