当前位置: 首页 > 知识库问答 >
问题:

discord.js给我留下了“TypeError:无法读取未定义的属性'includes'”,同时尝试将游戏消息转换为discord消息

罗翰
2023-03-14

我最近尝试从github(https://github.com/mew/discord-Hypixel-bridge)运行一个项目,该项目使用node.js,并将discord服务器通道链接到我试图使用它的minecraft服务器上的公会通道。它基本上应该做的是检测当一个消息在不和谐通道中发送,发送它在与我链接的bot帐户的公会聊天和接收消息的人在公会聊天类型,并发送他们到不和谐服务器使用我的bot在其中。将消息从discord发送到guild chat是没有问题的,但是当任何人在guild chat中键入任何内容,同时试图将该信息发送到我的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文件的一个示例!我不知道什么是要在这里和我没有太多的知识,只是想能够运行这个!谢谢!<3

共有1个答案

安高翰
2023-03-14

首先,您正在使用的项目是一个正在进行的工作(根据其在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)。这段代码中的第二个参数(number)指示拆分字符串的次数。因为指定的数字是2,所以它只会拆分字符串两次。这可能会导致一个常见的错误观念,您正在使用的项目的作者也是这个错误观念的牺牲品。

下面是使用.split(“”,2)对前面的示例句“hello my friend”所做的操作:[“hello”,“my”]。我猜项目的作者实际上想让代码做一些类似[“Hello”,“My Friend”]的事情,但是他们没有意识到.split()并不是这样工作的,因此成为了常见误解的牺牲品。

那么为什么这会导致错误呢?因为if语句尝试在v[2]上使用.include(),其中v是拆分的数组结果。所以让我们假设v是上面示例的精确结果([“hello”,“my”])。数组具有用于访问其内部数据的索引,索引从零开始。因此在我们的示例中,v[0]是“hello”,v[1]是“my”。但是项目的代码正在尝试获取v[2],这将是数组中的第三个元素。但是,如前所述,.split(“”,2)的数组输出将只包含两个元素;v中没有第三个元素。因此,v[2]未定义的,这就是发生错误的原因。

解决方案

假设我正确理解了作者的意图,这里有一种方法可以修复这个特定的错误:

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)的链接,这也是回答者的一大不便。

 类似资料:
  • (新手在编码,我只是按照教程,并尝试理解和学习的同时)我最近想编码我自己的不和谐机器人,但我有一个问题的事件处理程序部分,所以我尝试了另一种方法,但现在我有另一个问题。 它没有用“砰”来回应“砰!砰”,而是说: 客户命令。获取('ping')。执行(消息,args)^ TypeError:无法读取未定义的属性“get” 反对。执行(…/events/message.js:18:23) 在客户端。

  • 无论我做了什么,我总是得到未定义的错误。当我,有值时,我确实有值,但我的浏览器控制台一直在提示它,我尝试了不同的方法,比如先设置一个空字符串,移动另一个函数中的for-loop并将其设置为等待,但一切都不起作用。 错误类型错误:无法读取EmployeeEditComponent.Push../src/app/pages/employee/Employee-Edit/Employee-Edit/Em

  • help命令有一个错误,错误是 是代码我不知道出了什么问题。

  • 如果函数在组件中,那么一切都很好。如果我把它单独取出并导出到一个组件中,那么我会得到一个错误TypeError:不能读取未定义的属性(读取'reduce')

  • 问题内容: 我试图在ajax回调从REST api接收数据后设置组件的setState。这是我的组件构造函数代码 然后,我有一个如下所示的方法。 现在,这是我执行getAJAX请求的getPosts函数。 我想设置状态,但出现以下错误。 不太清楚是什么原因造成的。如果有人指出我正确的方向,那将真的很有帮助。提前致谢。 问题答案: 还绑定回调函数,以便回调内部指向React Component的上下

  • 我试图使用node.js express web服务器中的@tensorflow/tfjs-node模块。但是,我得到了下面的错误。我不明白为什么我会出现这个错误。我刚刚在node.js服务器中添加了1行代码。我使用“npm install@tensorflow/tfjs-node”完成的安装。可能的问题是什么? null 先谢谢你, var nonMaxSuppressionV3Impl=tf.