«Ошибка типа: не удается прочитать свойство ‘split’ неопределенного» discord.js v12

#discord.js

#discord.js

Вопрос:

Я продолжаю получать

«Ошибка типа: не удается прочитать свойство ‘split’ неопределенного»

при выполнении -mute команды для моего бота discord. Я следую этому руководству:

И строка, вызывающая ошибку, выглядит идентично его. Вот мой код:

     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 durationn**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 typen**Syntax**: '   syntax)
            return;
        }

        const seconds = duration * durations[durationType];

        console.log('MENTIONS:', mentions)
        const redisClient = await (redis)
        try {

        } finally {
            redisClient.quit()
        }
    }
}
 

Комментарии:

1. привет, трассировка стека сообщает вам, где происходит ошибка?

2. Строка 15: 31, забыл включить это, извините.

3. Можете ли вы добавить console.log(message) и console.log(message.content) в начале функции?

4. @Aplet123 [ ‘отключить звук’, ‘<@!752989978535002134>’, ‘1’, ‘ m’ ] не определено

5. Ваша функция должна быть async execute(message, args) or execute(message, args) , not execute(async, message, args) .

Ответ №1:

Проблема

Ваше async ключевое слово находится в неправильном месте. В вашем коде вы вставили async в круглые скобки своей функции ( execute(async, message, args) ), что заставило вашу программу думать, что async это один из параметров вашей функции.

По сути, когда ваш основной js-файл выполняет код этой команды, он вызывает функцию команды execute , которую вы указали в своем вопросе. Таким образом, основной файл js будет делать что-то вроде: mutecommand.execute(message, args) .

Когда он это делает, он установил значение первого параметра вашей функции message равным и значение вашего второго параметра 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 может быть неопределенным — это if message не имеет message.content свойства.

Итак, если message.content значение не определено, и мы знаем, что все сообщения имеют содержимое, тогда что это message ? Ну, вот тут и начинается отладка. Вы можете вручную отладить это очень легко с помощью простого console.log(message) , как предложено в комментариях. И когда вы зарегистрировали это, вы получили следующий результат : [ 'mute', '<@!752989978535002134>', '1', 'm' ] .

Ну, разве это не выглядит знакомо? Это массив, содержащий имя вашей команды, упоминание, длительность и тип длительности. Из синтаксиса вашей команды вы знаете, что это массив аргументов вашей команды. Итак, теперь вы знаете, что ваша message переменная содержит ваши аргументы. Это может быть вызвано одной из двух причин: либо ваш обработчик команд неправильно вызывает execute метод, либо параметры вашей функции перепутаны / перепутаны. Если у вас есть какие-либо другие рабочие команды в вашем боте, вы можете исключить первую причину, и это четко определяет причину, по которой вы получаете свою ошибку (вторая причина): «параметры вашей функции перепутаны / перепутаны».

Если бы вы затем посмотрели на пример / шаблон бота (используя тот же формат, который вы используете для своего бота, в отличие от используемого вами руководства), и сравнили его execute со своим собственным, вы бы быстро и легко выяснили, в чем проблема. Вам нужно научиться проходить этот процесс самостоятельно и попытаться решить эти простые проблемы самостоятельно. Вы можете обратиться к StackOverflow, если вы все еще застряли, даже после длительных попыток самостоятельного устранения проблемы, но это не то место, куда следует обращаться всякий раз, когда вы сталкиваетесь с проблемой; сначала попробуйте найти решение самостоятельно, потому что вы обнаружите, что большинство проблем, с которыми вы сталкиваетесь, имеют чрезвычайно простые исправления.

Решение

Это изменение, которое необходимо внести, чтобы устранить ошибку, с которой вы столкнулись в этом вопросе:

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

Пожалуйста, не просто копируйте и вставляйте это решение в свой код. Прочтите приведенное выше объяснение, поймите, в чем заключалась проблема, и поймите, как вы можете исправить такие проблемы самостоятельно в будущем.