&引用;TypeError:无法读取属性';拆分';“未定义”的定义;discord.jsv12
我不断地得到一份工作 “TypeError:无法读取未定义的属性'split'” 为我的discord bot运行&引用;TypeError:无法读取属性';拆分';“未定义”的定义;discord.jsv12,discord.js,Discord.js,我不断地得到一份工作 “TypeError:无法读取未定义的属性'split'” 为我的discord bot运行-mute命令时。我谨此陈辞: 导致错误的那条线看起来和他的一模一样。这是我的密码: const { GuildMember } = require("discord.js") const BotVersion = require('../package.json').version; const Discord = require("d
-mute
命令时。我谨此陈辞:
导致错误的那条线看起来和他的一模一样。这是我的密码:
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()
}
}
}
const{
行会成员
}=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={
名称:“静音”,
说明:“静音”,
执行(异步、消息、参数){
const{content,channel,indications}=message
const split=content.trim().split(“”)
常量语法='-mute';
if(split.length!==4){
channel.send('参数不足:没有输入符号:\n**Syntax**:'+Syntax)
返回;
}
常量持续时间=拆分[2]
const durationType=split[3]
如果(isNaN(持续时间)){
channel.send('请提供持续时间的数字\n**Syntax**:'+Syntax)
返回;
}
常数持续时间={
m:60,
h:60*60,
d:60*60*24,
寿命:-1
}
如果(!durations[durationType]){
channel.send('请提供有效的持续时间类型\n**语法**:'+语法)
返回;
}
常数秒=持续时间*持续时间[持续时间类型];
log('提及:',提及)
const redisClient=await(redis)
试一试{
}最后{
redisClient.quit()
}
}
}
问题
您的async
关键字位于错误位置。在代码中,将async
放在函数的括号内(execute(async,message,args)
),这使程序误以为async
是函数的参数之一
基本上,当主js文件执行该命令的代码时,它会调用该命令的execute
函数,这就是您在问题中提供的函数。因此,主js文件将执行以下操作:mutecommand.execute(message,args)
执行此操作时,它已将函数的第一个参数的值设置为message
,将第二个参数的值设置为args
。因此,当我们在您的问题中输入代码时,async
变量现在包含消息,message
变量现在包含命令的参数,args
变量未定义。由于命令的参数只是一个值数组,而不是带有Message.content
属性或.split()
方法的Message
对象,因此您得到的错误是TypeError:无法读取未定义的的属性“split”
发现问题
现在,这个问题应该是相当简单的,可以自己调试和解决。让我们更仔细地看一下错误消息:
TypeError: Cannot read property 'split' of undefined
错误告诉了我们什么?它告诉我们,您的代码试图拆分未定义的内容。那你在哪里分东西?代码中只有一个地方会发生这种情况:const split=content.trim().split(“”)
。因此,根据这些信息,错误告诉我们content.trim()
未定义(这意味着content
本身必须未定义,因为.trim()
是如何工作的)
现在我们知道,内容
是未定义的。为什么它没有定义,我们在哪里定义内容?好的,我们在这里做:const{content,channel,indications}=message
。我们没有得到任何语法错误,而且语法确实是正确的,因此content
的定义是正确的。这意味着内容
可以取消定义的唯一方法是消息
没有message.content
属性
所以如果message.content
未定义,并且我们知道所有消息都有内容,那么message
是什么?这就是调试的作用。您可以使用一个简单的console.log(message)
(注释中建议的)手动调试它。当您记录此信息时,您会得到以下结果:['mute',''1','m']
嗯,那看起来不是很熟悉吗?这是一个数组,包含命令的名称、名称、持续时间和持续时间类型。从命令的语法可以看出,这是命令参数的数组。现在您知道消息
变量包含参数。这可能是由以下两个原因之一造成的:要么是命令处理程序错误地调用execute
方法,要么是函数的参数混乱/混淆。如果您的bot中有任何其他工作命令,您可以排除第一个原因,这清楚地确定了您出错的原因(第二个原因):“您的函数参数混乱/混淆”
如果您接着查看一个示例/模板bot(使用与bot相同的格式,与您正在使用的教程不同),并将其execute
与您自己的进行比较,您将能够快速轻松地找出问题所在。你需要学会自己经历这类过程,并尝试自己解决这些简单的问题。如果您在尝试自己调试问题很长一段时间后仍然被卡住,那么您可以使用StackOverflow,但这不是您遇到问题时可以使用的地方;首先试着自己寻找解决方案,因为你会发现你遇到的大多数问题都有非常简单的解决方法
解决方案
这是c
module.exports = {
name: 'mute',
description: "mute",
async execute(message, args) {