【问题标题】:"TypeError: Cannot read property 'split' of undefined" discord.js v12“TypeError:无法读取未定义的属性‘split’” 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)

标签: discord.js


【解决方案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) {

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

【讨论】:

    最近更新 更多