【问题标题】:Cannot read property 'includes' of undefined无法读取未定义的属性“包含”
【发布时间】:2019-07-26 22:16:52
【问题描述】:

我是 JavaScript 新手,我是在尝试剖析嵌入的消息。这是我的代码,它可以正常运行几分钟,相应地工作,但我知道出了什么问题。

bot.on('message', (message) => {
  for (var i = 0; i < message.embeds.length; i++) {
    if (message.embeds[i].title.includes("text!")) {
      message.channel.send('reply')
    }
  }
})

【问题讨论】:

  • 尝试打印日志中的message元素,看看是否有空元素

标签: javascript node.js discord.js


【解决方案1】:

它的空指针错误。您的一些对象参数为空,但它映射在 html 中。请尝试添加更多空检查以避免这种情况。

在访问之前始终检查项目

bot.on('message', (message) => {
  for (var i = 0; i < message.embeds.length; i++) {
    if (message.embeds[i].title && message.embeds[i].title.includes("text!")) {
      message.channel.send('reply')
    }
  }
})

【讨论】:

    【解决方案2】:

    JavaScript 不是类型安全的语言,错误是由不类型安全引起的。我们必须检查对象是否存在和嵌套属性是否存在,然后我们应该能够检查该值。在你的情况下:

    
    bot.on('message', (message) => {
    
      // check if main obj and main property exist
      if (message && message.embeds) {
    
        for (var i = 0; i < message.embeds.length; i++) {
          // now, check if title exists and after check the text inside
          if (
            message.embeds[i].title && 
            message.embeds[i].title.includes("text!")) 
          {
            message.channel.send('reply')
          }
        }
    
      }
    });
    
    

    【讨论】:

      【解决方案3】:

      表示message.embeds[i]内部至少有一个没有title属性的元素。

      你应该先检查message.embeds[i].title是否存在,检查后进行其他操作。

      【讨论】:

        【解决方案4】:

        这是因为 embeds 数组项中至少有一项缺少 title 属性。

        您需要将 if 语句更新为:

        If (message.embeds[i] &&
         message.embeds[i].title && ...)
        

        【讨论】:

          【解决方案5】:

          可能有一些embed 对象没有title 属性。

          您可以安全地使用您的逻辑将您的 if 条件更改为:

          if ('title' in message.embeds[i] && message.embeds[i].title.includes("text!")) {
             /* ... */
          }
          

          【讨论】:

          • bot.on('message', (message) =&gt; { for (var i = 0; i &lt; message.embeds.length; i++) { if (message.embeds[i] &amp;&amp; message.embeds[i].description.includes("✨")) { console.log('emoji detected'); break; } } 我这样做了,但出现了同样的错误。
          【解决方案6】:

          您可以像这样编写更具防御性的代码。而不是

          if(message.embeds[i].title.includes("text!"))
          

          你可以这样写

          if(typeof message.embeds[i].title === "string" &&
          message.embeds[i].title.includes("text!"))
          

          【讨论】:

            【解决方案7】:

            我认为这段代码可以解决这个问题。

            
            bot.on('message', (message) => {
              for (var i = 0; i < message.embeds.length; i++) {
                if (message.embeds[i] && message.embeds[i].title.includes("text!")) {
                  message.channel.send('reply')
                }
              }
            })
            
            

            【讨论】:

            • bot.on('message', (message) =&gt; { for (var i = 0; i &lt; message.embeds.length; i++) { if (message.embeds[i] &amp;&amp; message.embeds[i].description.includes("✨")) { console.log('emoji detected'); break; } } 我这样做了,但出现了同样的错误。
            • 如果 title 属性丢失或为空,这将不起作用。
            猜你喜欢
            • 2021-12-21
            • 2020-05-12
            • 2021-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多