“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', '&lt;@!752989978535002134&gt;', '1', 'm' ]

嗯,这看起来是不是很眼熟?这是一个包含命令名称、提及、持续时间和持续时间类型的数组。您知道,从您的命令语法来看,这是您的命令参数的数组。所以现在您知道您的 message 变量包含您的参数。这可能是由以下两个原因之一引起的:您的命令处理程序错误地调用了execute 方法,或者您的函数的参数被弄乱了/混淆了。如果您的机器人中有任何其他工作命令,您可以排除第一个原因,并且清楚地确定您收到错误的原因(第二个原因):“您的函数的参数被弄乱/混淆了”。

如果您接着查看示例/模板机器人(使用与您的机器人相同的格式,与您使用的教程不同),并将其 execute 与您自己的进行比较,您会很快并且很容易找出问题所在。你需要学会自己经历这种类型的过程,并尝试自己解决这些简单的问题。自己调试了好久还是卡住了可以来***,但是遇到问题不该去***;首先尝试自己找到解决方案,因为您会发现遇到的大多数问题都有非常简单的解决方法。

解决方案

这是解决您在此问题中遇到的错误所需进行的更改:

module.exports = 
    name: 'mute',
    description: "mute",
    async execute(message, args) 

请不要只是将此解决方案复制并粘贴到您的代码中。阅读上面的说明,了解问题所在,并了解将来如何自行解决此类问题。

【讨论】:

以上是关于“TypeError:无法读取未定义的属性‘split’” discord.js v12的主要内容,如果未能解决你的问题,请参考以下文章