Discord.js 在尝试将游戏消息转换为不和谐消息时给我留下“TypeError:无法读取未定义的属性 'includes'”
Posted
技术标签:
【中文标题】Discord.js 在尝试将游戏消息转换为不和谐消息时给我留下“TypeError:无法读取未定义的属性 \'includes\'”【英文标题】:Discord.js leaves me with "TypeError: Cannot read property 'includes' of undefined" while trying to convert in game messages to discord messagesDiscord.js 在尝试将游戏消息转换为不和谐消息时给我留下“TypeError:无法读取未定义的属性 'includes'” 【发布时间】:2021-04-02 12:01:45 【问题描述】:我最近尝试从 github (https://github.com/mew/discord-hypixel-bridge) 运行一个使用 node.js 的项目,并且应该将一个不和谐的服务器频道链接到我试图使用它的我的世界服务器上的公会频道。它基本上应该做的是检测何时在不和谐频道中发送消息,使用我链接的机器人帐户在公会聊天中发送它,并以公会聊天类型接收消息并使用我的将它们发送到不和谐服务器机器人在里面。 将消息从 discord 发送到公会聊天没有问题,但是当任何人在公会聊天中键入任何内容时尝试将该信息发送到我的 discord 服务器时,它会崩溃并在命令提示符中留下一些错误:
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 文件的示例!我对这里发生的事情一无所知,我也没有太多的知识,只是想能够运行它! 谢谢!
【问题讨论】:
Of undefined 表示您尝试对其执行方法的元素未定义;v[2]
在这种情况下,返回未定义。
需要知道'v'数组被分配在哪里和什么,以及它是否在这个函数开始运行之前被分配。顺便说一句,它返回了什么?什么都没有?
说实话,我真的不知道发生了什么,只是想用我几乎不存在的知识来运行它,但我想这对我来说太复杂了:/
【参考方案1】:
首先,project you are using 是一个正在进行中的工作(根据它在 github 上的 README),因此不能保证工作。尝试使用它不是一个好主意,尤其是如果您对 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
语句尝试在v[2]
上使用.includes()
,其中v
是拆分的数组结果。因此,假设v
是我们上面示例的准确结果 (["Hello", "my"]
)。数组具有用于访问其中数据的索引,并且索引从零开始。所以在我们的示例中,v[0]
是“Hello”,v[1]
是“my”。但是该项目的代码正在尝试获取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 中的错误。
备注
虽然这些修复程序应该可以解决您遇到的问题,但我怀疑这会让该项目正常工作。我既没有测试过项目也没有测试过我的固定版本,但我很确定它会有更多错误,因为代码看起来很不完整。鉴于作者是上述常见误解的受害者,他们可能在代码中犯了更简单的逻辑错误,导致代码无法正常运行。
此外,为了将来在 *** 上提问时参考,请通过代码块直接在您的问题中提供相关代码,如本答案中的代码块。您的问题仅包含一行代码,并且不包含代码的所有相关部分(您应该在您提供的行上方和下方包含一些行)。您不应该在此处提问时仅附上 Github 等外部来源的链接,这也给回答者带来了很大的不便。
【讨论】:
以上是关于Discord.js 在尝试将游戏消息转换为不和谐消息时给我留下“TypeError:无法读取未定义的属性 'includes'”的主要内容,如果未能解决你的问题,请参考以下文章