Discord.js оставляет мне сообщение «Ошибка типа: невозможно прочитать свойство« включает »из неопределенного» при попытке преобразовать игровые сообщения в сообщения разногласий

Недавно я попытался запустить проект с github (https://github.com/mew/discord-hypixel-bridge), который использует node.js и должен связать канал сервера раздора с каналом гильдии в майнкрафте. сервер, для которого я пытаюсь использовать это. В основном предполагается, что он определяет, когда сообщение отправляется в канал разногласий, отправляет его в чат гильдии с учетной записью бота, которую я связал, и получает сообщения людей в типе чата гильдии и отправляет их на сервер раздора, используя мой бот в нем. Отправка сообщения из раздора в чат гильдии не вызывает проблем, однако, когда кто-либо вводит что-либо в чат гильдии при попытке отправить эту информацию на мой сервер раздора, происходит сбой, и в командной строке появляется несколько ошибок:

C:\Users\betab\Pictures\Epicness\index.js:52
            if (v[2].includes(name + ":") || v[3].includes(name + ":")) return;
                     ^
    
TypeError: Cannot read property 'includes' of undefined
    at Bot.<anonymous> (C:\Users\betab\Pictures\Epicness\index.js:52:18)
    at Bot.emit (events.js:315:20)
    at Client.<anonymous> (C:\Users\betab\Pictures\Epicness\node_modules\mineflayer\lib\plugins\chat.js:79:9)
    at Client.emit (events.js:315:20)
    at FullPacketParser.<anonymous> (C:\Users\betab\Pictures\Epicness\node_modules\minecraft-protocol\src\client.js:89:12)
    at FullPacketParser.emit (events.js:315:20)
    at addChunk (C:\Users\betab\Pictures\Epicness\node_modules\readable-stream\lib\_stream_readable.js:298:12)
    at readableAddChunk (C:\Users\betab\Pictures\Epicness\node_modules\readable-stream\lib\_stream_readable.js:280:11)
    at FullPacketParser.Readable.push (C:\Users\betab\Pictures\Epicness\node_modules\readable-stream\lib\_stream_readable.js:241:10)
    at FullPacketParser.Transform.push (C:\Users\betab\Pictures\Epicness\node_modules\readable-stream\lib\_stream_transform.js:139:32)

Я действительно не знаю, почему это происходит, поскольку я не тот, кто закодировал это, поэтому помощь приветствуется! Поскольку я не уверен, почему это происходит, но я включил файл index.js и пример файла config.json! Я понятия не имею, что здесь происходит, и у меня мало знаний, и я просто хотел запустить это! Спасибо! <3

Из неопределенных означает, что элемент, для которого вы пытаетесь выполнить метод, не определен; v[2] в этом случае возвращается undefined.

Elitezen 23.12.2020 23:05

Необходимо знать, где и какой массив 'v' назначается, и назначается ли он до запуска этой функции. Кстати, что он возвращает? Ничего?

Esko 23.12.2020 23:30

Честно говоря, я понятия не имею, что происходит, и просто хотел запустить это с моими почти несуществующими знаниями, но я думаю, что это слишком сложно для меня :/

Backstory 24.12.2020 00:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
561
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, проект , который вы используете , находится в стадии разработки (согласно его README на github), поэтому его работа не гарантируется. Не стоит пытаться использовать его, особенно если у вас ограниченные знания javascript или discord.js, учитывая, что он может содержать множество ошибок и потенциально может вообще не работать.

Проблема

Что касается ошибки, которую вы получаете, позвольте мне объяснить ее. Вот строки кода, в которых возникает ошибка:

let v = msg.split(" ", 2);
if (v[2].includes(name + ":") || v[3].includes(name + ":")) return;

msg.split(" ") разбивает строку на основе пробелов и создает массив каждого элемента между пробелами (словами предложения). По сути, если бы вы split() выполнили предложение "Hello my friend", вы бы получили результат массива: ["Hello", "my", "friend"].

Однако код, который вы используете, делает msg.split(" ", 2). Второй аргумент (число) в этом коде указывает, сколько раз нужно разделить строку. Поскольку указанное число равно 2, оно разделит строку только дважды. Это может привести к распространенному заблуждению, жертвой которого стал и автор используемого вами проекта.

Итак, вот что сделает .split(" ", 2) с примерным предложением "Hello my friend" из предыдущего: ["Hello", "my"]. Я предполагаю, что автор проекта действительно хотел, чтобы код делал что-то вроде ["Hello", "my friend"], но они не понимали, что .split() так не работает, поэтому стали жертвой распространенного заблуждения.

Так почему же это вызывает ошибку? Потому что оператор if пытается использовать .includes() в v[2], где v — результат разделения массива. Итак, скажем, v является точным результатом нашего примера выше (["Hello", "my"]). Массивы имеют индексы, которые вы используете для доступа к данным внутри них, и индексы начинаются с нуля. Итак, в нашем примере v[0] — это «Привет», а v[1] — «мой». Но код проекта пытается получить v[2], который будет третьим элементом в массиве. Однако, как упоминалось выше, вывод массива .split(" ", 2) будет содержать только два элемента; в v нет третьего элемента. Следовательно, v[2] есть undefined, и поэтому возникает ошибка.

Решение

Предполагая, что я правильно понял намерения автора, вот один из способов исправить эту конкретную ошибку:

let v = [msg.split(" ")[0], msg.split(" ").slice(1).join(" ")];
if (v.length < 2 || v[1].includes(name + ":")) return;

Вместо ошибочного разделения, как раньше, теперь мы делаем что-то другое. Мы создаем свой собственный массив. Для первого элемента: мы вставляем первый элемент фактического разделения сообщения. Для второго элемента: мы берем разбиение сообщения, получаем каждый элемент, кроме первого (используя .slice(1), который «нарезает» массив, начиная с индекса 1 и заканчивая в конце), и неразделяем/объединяем эти элементы оригинала разделить с помощью пробела; по сути, мы получаем все в сообщении после первого пробела. Это позволяет нам проверять name + ":" во всех частях сообщения, следующих за первой частью, чтобы убедиться, что имя находится в правильной части сообщения.

Теперь есть и другие способы сделать это, например, использовать .replace() для замены первого пробела в msg некоторой последовательностью символов, а затем разделить вывод на эту последовательность символов. Это всего лишь один из способов сделать это.

Я также изменил оператор if, чтобы убедиться, что в массиве действительно есть как минимум два элемента. Это связано с тем, что массив будет содержать менее двух элементов (один или меньше), если сообщение было пустым или если сообщение вообще не было отправлено, и вы бы не хотели, чтобы код выполнялся в любом из этих случаев. Что касается того, почему вы не хотели бы этого делать: если пользователь отправляет пустое сообщение в mc, вы действительно хотите отправить пустое сообщение в разногласиях? Это даже невозможно сделать, несмотря на то, что это вызовет ошибку в discord.js.

Примечания

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

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

Другие вопросы по теме