“类型错误:无法读取未定义的属性‘拆分’”discord.js v12

时间:2020-12-22 23:14:35

标签: discord.js

我一直收到一个

<块引用>

“类型错误:无法读取未定义的属性“拆分””

为我的不和谐机器人运行 -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()
        }
    }
}

1 个答案:

答案 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

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