无法读取未定义的 属性 'includes'

Cannot read property 'includes' of undefined

我是 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')
    }
  }
})

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


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')
    }
  }
})

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

您需要将 if 语句更新为:

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

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

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

你可以这样写

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

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

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

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

表示在message.embeds[i]里面至少有一个元素没有标题属性。

首先检查message.embeds[i].title是否存在,检查完成后再进行其他操作

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')
      }
    }

  }
});

它的空指针错误。您的某些对象参数为空,但它映射在 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')
    }
  }
})