简体   繁体   中英

Cannot read property 'includes' of undefined

I am new to JavaScript, am I was trying to dissect an embedded message. Here's my code, it runs fine for a few mins, works accordingly but idk what goes wrong.

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

Its because there is at least one item inside the embeds array items that missing the title property.

You will need to update the if statement to be:

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

I think this code can fix this problem.


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

It means inside message.embeds[i] there is at least one element without title property.

You should check first if message.embeds[i].title exists and perform other operations after the check.

You can write your code more defensive like this. Instead of

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

you can write the following

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

Probably some of the embed object is coming without the title property.

You can safely use your logic changing your if condition to:

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

JavaScript is not a type safe language, and the error is caused by not being type safe. We will have to check if object exists and nested properties exists and after we should be able check the value. In your case:


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

  }
});

its null pointer error. some of your object parameter is null but its mapped in html. Please try to add more null checks to avoid this .

always check an item before accessing it

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM