如何修复“TypeError:无法读取未定义的属性 'toString'” |不和谐.js

Posted

技术标签:

【中文标题】如何修复“TypeError:无法读取未定义的属性 \'toString\'” |不和谐.js【英文标题】:How to fix "TypeError: Cannot read property 'toString' of undefined" | discord.js如何修复“TypeError:无法读取未定义的属性 'toString'” |不和谐.js 【发布时间】:2020-07-31 04:33:24 【问题描述】:

我正在尝试为我的不和谐机器人创建赠品命令。

一切都很完美,除了最后部分显示谁赢得了赠品。我正在尝试将 winners 数组转换为字符串,以便我可以发送一条显示获胜者的消息。我花了一整天的时间试图解决这个问题(说实话,我不太擅长编程)但无济于事。 请帮忙!

message.channel.send("???? **GIVEAWAY** ????").then(() => 
  message.channel.send(Embed).then((gMessage) => 
    gMessage.react("????");
    setTimeout(function() 
      var peopleReacted = gMessage.reactions.cache.get("????").users;
      var winners = [];

      // Checks if fewer people reacted than the the winner count allows users to win
      if (peopleReacted.length <= args[2]) 
        winners = peopleReacted;
       else 
        // Gets as many random users from the peopleReacted as the winner count allows users to win
        for (var i = 0; i < args[2]; i++) 
          var index = Math.floor(
            Math.random() * peopleReacted.length
          );
          winners.push(peopleReacted[index]);
          // After adding a user to winners, remove that item from the array to prevent them from winning multiple times
          peopleReacted.cache.array().splice(index, 1);
        
      

      var winnerMsg = "User(s) ";
      for (var i = 0; i < winners.length; i++) 
        // Add each winner to the winnerMsg
        winnerMsg += winners[i].toString() + ", ";
      

      var haveHas;
      if (winners.length === 1) 
        haveHas = "has";
       else 
        haveHas = "have";
      
      message.channel.send(`$winnerMsg $haveHas won $msgArgs`);
    , time * (60 * 1000));
  );
);

如果有帮助,我的所有机器人代码都可以在 here 找到。

【问题讨论】:

尝试调试。显然,winners[i] 在某些时候为空,因此null.toString() 将抛出异常 在尝试将其转换为字符串之前添加 console.log(winners[i])console.log(winners) 并告诉我们它返回的内容。 @Aci 我照你说的做了。对于console.log(winners[i]),我得到了undefined,对于console.log(winners),我得到了[ undefined ]。登录时我没有对赠品做出反应,并说只能有一个赢家。 (机器人是唯一做出反应的。) 我呃...在这方面仍然需要帮助。 【参考方案1】:

gMessage.reactions.cache.get("?").users 可能是问题所在,因为gMessage.reactions.cache.get("?") 返回一个集合,它没有用户属性(= 它是undefined)。 如果您想将反应作为一个数组,只需使用gMessage.reactions.cache.get("?").array(),这将返回一个包含用户对象的数组(注意:这些不是“普通”用户对象,而是ReactionUserManager,您可以在文档中找到更多关于这些的信息https://discord.js.org/#/docs/main/stable/class/ReactionUserManager)

【讨论】:

遇到错误TypeError: gMessage.reactions.cache.get(...).array is not a function :\ @LiamTheSnowLeopard 您使用的是哪个版本的 Discord.js?这些文档适用于 v12,与 v11 相比发生了很大变化,在我的旧机器人(使用 v11.5.1 左右)中,我不得不做 msg.reactions.first().users.array() 例如。您可以在 package.json 文件中查看您的版本 我正在为我的机器人使用 discord.js v12.1.1。如果我的版本有问题,你会碰巧知道.array() 的替代品吗? Nvm,我发现了一个和.array()非常相似的函数,就是.toArray()。我将在今天晚些时候对其进行测试。 我收到一条错误消息,说.toArray() 不是一个函数……嗯,值得一试,哈哈

以上是关于如何修复“TypeError:无法读取未定义的属性 'toString'” |不和谐.js的主要内容,如果未能解决你的问题,请参考以下文章

构建新的 Vue CLI 3 项目时,如何修复 terser-webpack-plugin 中的“TypeError:无法读取未定义的属性“缩小”?

TypeError:无法读取未定义的属性“获取”(修复冲突导入不起作用)

不和谐赠品| TypeError:无法读取未定义的属性“开始”

ReactJS TypeError:无法读取未定义的属性“推送”

如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?

如何解决 TypeError:无法读取未定义的属性“过滤器”