我一直收到一个
<块引用>“类型错误:无法读取未定义的属性“拆分””
为我的不和谐机器人运行 -mute
命令时。我正在关注此tutorial:
导致错误的那一行看起来和他的一样。这是我的代码:
const {
GuildMember
} = require("discord.js")
const BotVersion = require('../package.json').version;
const Discord = require("discord.js");
var botdev = require('../data.json').botdev;
const redis = require('../redis.js')
module.exports = {
name: 'mute',
description: "mute",
execute(async, message, args) {
const { content, channel, mentions } = message
const split = content.trim().split(' ')
const syntax = '-mute <@member> <duration as a number> <m, h, d, or life>';
if (split.length !== 4) {
channel.send('Insufficient parameters :no_entry_sign:\n**Syntax**: ' + syntax)
return;
}
const duration = split[2]
const durationType = split[3]
if (isNaN(duration)) {
channel.send('Please provide a number for the duration\n**Syntax**: ' + syntax)
return;
}
const durations = {
m: 60,
h: 60 * 60,
d: 60 * 60 * 24,
life: -1
}
if (!durations[durationType]) {
channel.send('Please provide a valid duration type\n**Syntax**: ' + syntax)
return;
}
const seconds = duration * durations[durationType];
console.log('MENTIONS:', mentions)
const redisClient = await (redis)
try {
} finally {
redisClient.quit()
}
}
}
答案 0 :(得分:0)
问题
您的 async
关键字位置错误。在您的代码中,您将 async
放在函数的括号 (execute(async, message, args)
) 中,这使您的程序误以为 async
是您函数的参数之一。
本质上,当您的主 js 文件执行此命令的代码时,它会调用命令的 execute
函数,这是您在问题中提供的函数。因此,主要的 js 文件将执行以下操作:mutecommand.execute(message, args)
.
执行此操作时,它已将函数的 first 参数的值设置为 message
,将 second 参数的值设置为 {{ 1}}。因此,当我们在您的问题中输入代码时,args
变量现在包含消息,async
变量现在包含命令的参数,而 message
变量未定义。由于命令的参数只是一个值数组,而不是具有 args
属性或 Message
方法的 message.content
对象,因此您会收到错误 .split()
。
发现问题
现在,这个问题应该很容易自行调试和解决。让我们更仔细地看一下错误消息:
TypeError: Cannot read property 'split' of undefined
错误告诉我们什么?它告诉我们您的代码正在尝试 TypeError: Cannot read property 'split' of undefined
未定义的内容。那么你在哪里拆分东西?您的代码中只有一处发生这种情况:split
。因此,根据这些信息,错误告诉我们 const split = content.trim().split(' ')
未定义(这意味着 content.trim()
本身必须未定义,因为 content
的工作方式)。
所以现在我们知道 .trim()
是未定义的。为什么未定义,我们在哪里定义content
?好吧,我们在这里做:content
。我们没有收到任何语法错误,而且该语法确实是正确的,因此 const { content, channel, mentions } = message
的定义正确。这意味着 content
可能未定义的唯一方法是 content
没有 message
属性。
因此,如果 message.content
未定义,并且我们知道所有消息都有内容,那么 message.content
是什么?嗯,这就是调试的用武之地。您可以使用简单的 message
非常轻松地手动调试它,如注释中所建议。当您记录此内容时,您会得到以下结果:console.log(message)
.
嗯,是不是很眼熟?这是一个包含命令名称、提及、持续时间和持续时间类型的数组。您知道,从您的命令的语法来看,这是您的命令参数的数组。所以现在您知道您的 [ 'mute', '<@!752989978535002134>', '1', 'm' ]
变量包含您的参数。这可能是由以下两个原因之一引起的:您的命令处理程序错误地调用了 message
方法,或者您的函数的参数混乱/混淆。如果您的机器人中有任何其他工作命令,您可以排除第一个原因,这清楚地确定了您收到错误的原因(第二个原因):“您的函数参数被弄乱/混淆了”。< /p>
如果您随后继续查看示例/模板机器人(使用您用于机器人的相同格式,与您使用的教程不同),并将其 execute
与您自己的进行比较,您会快速轻松地找出问题所在。你需要学会自己经历这种类型的过程,并尝试自己解决这些简单的问题。如果您在尝试自己调试问题很长时间后仍然卡住了,您可以来 StackOverflow,但是当您遇到问题时,这不是去的地方;首先尝试自己找到解决方案,因为您会发现您遇到的大多数问题都有非常简单的修复方法。
解决方案
这是解决您在此问题中遇到的错误所需的更改:
execute
请不要只是将此解决方案复制并粘贴到您的代码中。阅读以上说明,了解问题所在,并了解您以后如何自行解决此类问题。