“TypeError:无法读取未定义的属性‘split’” discord.js v12
Posted
技术标签:
【中文标题】“TypeError:无法读取未定义的属性‘split’” discord.js v12【英文标题】:"TypeError: Cannot read property 'split' of undefined" discord.js v12 【发布时间】:2021-04-01 15:36:23 【问题描述】:我一直收到一个
“TypeError: 无法读取未定义的属性‘split’”
为我的不和谐机器人运行-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()
【问题讨论】:
嗨,堆栈跟踪是否告诉您错误发生在哪里? 第 15:31 行,忘记包含了,抱歉。 你能在函数的开头添加console.log(message)
和console.log(message.content)
吗?
@Aplet123 ['静音', '', '1', 'm' ] 未定义
你的函数应该是async execute(message, args)
或execute(message, args)
,而不是execute(async, message, args)
。
【参考方案1】:
问题
您的 async
关键字位于错误的位置。在您的代码中,您将 async
放在了函数的括号 (execute(async, message, args)
) 中,这使您的程序认为 async
是函数的参数之一。
基本上,当您的主 js 文件执行此命令的代码时,它会调用您在问题中提供的命令的 execute
函数。因此,主 js 文件将按照以下方式进行操作:mutecommand.execute(message, args)
。
执行此操作时,它会将函数的 first 参数的值设置为 message
,并将 second 参数的值设置为 args
。因此,当我们在您的问题中输入代码时,async
变量现在包含消息,message
变量现在包含命令的参数,args
变量未定义。因为命令的 args 只是一个值数组,而不是具有 message.content
属性或 .split()
方法的 Message
对象,所以您会收到错误 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)
非常轻松地手动调试它,正如 cmets 中所建议的那样。当您记录此内容时,您会得到以下结果:[ 'mute', '<@!752989978535002134>', '1', 'm' ]
。
嗯,这看起来是不是很眼熟?这是一个包含命令名称、提及、持续时间和持续时间类型的数组。您知道,从您的命令语法来看,这是您的命令参数的数组。所以现在您知道您的 message
变量包含您的参数。这可能是由以下两个原因之一引起的:您的命令处理程序错误地调用了execute
方法,或者您的函数的参数被弄乱了/混淆了。如果您的机器人中有任何其他工作命令,您可以排除第一个原因,并且清楚地确定您收到错误的原因(第二个原因):“您的函数的参数被弄乱/混淆了”。
如果您接着查看示例/模板机器人(使用与您的机器人相同的格式,与您使用的教程不同),并将其 execute
与您自己的进行比较,您会很快并且很容易找出问题所在。你需要学会自己经历这种类型的过程,并尝试自己解决这些简单的问题。自己调试了好久还是卡住了可以来***,但是遇到问题不该去***;首先尝试自己找到解决方案,因为您会发现遇到的大多数问题都有非常简单的解决方法。
解决方案
这是解决您在此问题中遇到的错误所需进行的更改:
module.exports =
name: 'mute',
description: "mute",
async execute(message, args)
请不要只是将此解决方案复制并粘贴到您的代码中。阅读上面的说明,了解问题所在,并了解将来如何自行解决此类问题。
【讨论】:
以上是关于“TypeError:无法读取未定义的属性‘split’” discord.js v12的主要内容,如果未能解决你的问题,请参考以下文章