【问题标题】:How to fix cannot ready property of undefined如何修复无法读取未定义的属性
【发布时间】:2019-12-08 23:40:42
【问题描述】:

所以,我一直在编写一个不和谐的机器人,并且在尝试检查“mrole”是否具有“app”属性时出现此错误。我不知道为什么这不起作用。

我希望它读取团队的 id,这样我就可以像这样整理 json 文件:

      let barney = message.guild.roles.find(r => r.name === "Barney")
      let deadpool = message.guild.roles.find(r => r.name === "Deadpool")
      let hulk = message.guild.roles.find(r => r.name === "Hulk")
      let mario = message.guild.roles.find(r => r.name === "Mario")
      let spiderman = message.guild.roles.find(r => r.name === "Spider-Man")
      let umbreon = message.guild.roles.find(r => r.name === "Umbreon")
      let app = message.guild.member(message.mentions.users.first());
      let app2 = message.mentions.users.first().username
      var mrole
      if (app.roles.has(barney.id)){
        mrole = barney.id
      }
      else if (app.roles.has(deadpool.id)){
        mrole = deadpool.id
      }
      else if (app.roles.has(hulk.id)){
        mrole = hulk.id
      }
      else if (app.roles.has(mario.id)){
        mrole = mario.id
      }
      else if (app.roles.has(spiderman.id)){
        mrole = spiderman.id
      }
      else if (app.roles.has(umbreon.id)){
        mrole = umbreon.id
      }
      if(mrole = barney.id || deadpool.id || hulk.id || mario.id || spiderman.id || umbreon.id){
          if (client.memberspoints.mrole[app.id].name != app2){
          client.memberspoints [mrole] = {
            [app2.id]: {
              name: `${app2}`, 
              mpoints: `${+args[1]}`
            }  
          }
          message.channel.send(`${app} agora tem ${+args[1]} pontos`);
          }
            else{
              let _mpoints = client.memberspoints.mrole[app.id].mpoints
              var smpoints = +_mpoints + +args[1]
              client.memberspoints [mrole] = {
                [app.id]:{
                  name: `${app2}`,
                  mpoints: `${smpoints}`
                }
              }
              message.channel.send(`${app} agora tem ${smpoints} pontos`);
            }
            fs.writeFile ('./memberspoints.json', JSON.stringify (client.memberspoints, null, 2), err => {
            if (err) throw err;
            console.log('Salvo');
            });

这是我得到的错误:
if (client.memberspoints.mrole[app.id].name != app2){ ^ TypeError: Cannot read property 'app.id' of undefined

我基本上希望它检查“mrole”上是否已经包含人名,所以我按团队和名称对其进行排序。有什么想法吗?

【问题讨论】:

  • 所以,你说有错误。它在哪里?您没有向我们提供任何解释代码或错误所在的信息。它不可重现,因为我们没有环境,因为您有自定义角色等。
  • 添加,它。那是我的错,对不起。
  • app 似乎是一个对象。那么,mrole[app] 的目的是什么?
  • mrole 未定义
  • 分解你的代码。控制台记录 app.id 以确保它是您所说的。然后看看mrole,看看它的属性。 mrole 听起来像一个对象,所以 app.id 需要是该对象中的一个键。如果没有,它会抛出。您需要抓住这种可能性,因为我在您的 sn-p 中没有看到任何类型的对象验证。我还注意到您没有其他声明。是否有可能是未定义的?

标签: javascript node.js discord.js


【解决方案1】:

要检查一个对象是否有某个属性,你应该使用object.hasOwnProperty方法:

hasOwnProperty() 方法返回一个布尔值,指示对象是否具有指定的属性作为它自己的属性(而不是继承它)。

所以,它会是这样的:

if(mrole.hasOwnProperty('app')) { // do stuff }

我最近了解到这可能是一个安全问题,所以最好像这样使用它:if( Object.prototype.hasOwnProperty.call(mrole, 'app')。 (您可以阅读更多here)。

现在,问题可能完全是另外一回事了——我注意到在这条线上 if(mrole = barney.id || deadpool.id || hulk.id || mario.id || spiderman.id || umbreon.id),您分配给 mrole,而不是比较!应该是if(mrole == ...

【讨论】:

  • 但是问题是mrole是未定义的,并不是它没有那个属性...,所以在它上面调用hasOwnProperty()会抛出一个错误,比如:Cannot read property 'hasOwnProperty' of undefined,最好使用typeof variable == 'undefined'
  • @FlashThunder 很好,虽然他第一次问的问题是“我如何检查一个对象是否具有某种属性”,所以我回答了这个问题:) 是的,这里有很多错误现在我再看一下代码:if 语句错误,mrole 未定义,if 语句内部有赋值...
猜你喜欢
  • 2019-08-19
  • 2021-02-28
  • 2019-11-02
  • 2021-10-03
  • 2021-10-28
  • 2021-03-03
  • 2022-01-12
  • 2022-11-22
  • 2019-10-03
相关资源
最近更新 更多