Недавно я попытался запустить проект с 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' назначается, и назначается ли он до запуска этой функции. Кстати, что он возвращает? Ничего?
Честно говоря, я понятия не имею, что происходит, и просто хотел запустить это с моими почти несуществующими знаниями, но я думаю, что это слишком сложно для меня :/



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Прежде всего, проект , который вы используете , находится в стадии разработки (согласно его 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, когда задаете вопрос здесь, и это также создает большие неудобства для отвечающих.
Из неопределенных означает, что элемент, для которого вы пытаетесь выполнить метод, не определен;
v[2]в этом случае возвращается undefined.