#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)
orexecute(message, args)
, notexecute(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) {
Пожалуйста, не просто копируйте и вставляйте это решение в свой код. Прочтите приведенное выше объяснение, поймите, в чем заключалась проблема, и поймите, как вы можете исправить такие проблемы самостоятельно в будущем.