【问题标题】:Discord Js cannot read property titles of undefinedDiscord Js无法读取未定义的属性标题
【发布时间】:2021-09-26 19:14:07
【问题描述】:

为我正在处理的不和谐机器人创建随机数生成器时,只要有人这样做+nhr,它要么可以工作,要么会在控制台中显示一条错误消息

TypeError: 无法读取未定义的属性“标题”

未处理的承诺拒绝。此错误源于抛出 在没有 catch 块的异步函数内部,或通过拒绝 未使用 .catch() 处理的承诺。终止节点 处理未处理的承诺拒绝,使用 CLI 标志

有人知道如何修复这个错误吗?

代码:

if (message.content.startsWith(prefix + 'nhr')) {
  //RANDOM PREFIX
  var rnumber = Math.floor(Math.random() * 1000000) + 1;
  if (message.channel.nsfw) {
    api.fetchDoujin(`${rnumber}`).then((doujin) => {
      const exampleEmbed = new Discord.MessageEmbed()
        .setColor('#ce0606')
        .setTitle(doujin.titles.pretty)
        .setURL(`https://youtube.com/${rnumber}`)
        .addFields(
          { name: 'Digits', value: `${rnumber}` },
          {
            name: 'Tags',
            value: doujin.tags.all.map((tag) => tag.name).join(', '),
          },
        )
        .setImage(doujin.cover.url)
        .setFooter('x', 'x');
      message.channel.send(exampleEmbed);
    });
  } else {
    const exampleEmbed = new Discord.MessageEmbed()
      .setColor('#ffc0cb')
      .setTitle('**x**')
      .setImage('x');
    message.channel.send(exampleEmbed);
  }
}

(如果代码中需要其他任何内容,请发表评论)

【问题讨论】:

  • 请不要在收到不错的答案后从根本上编辑问题。特别是不要将建议的解决方案编辑到问题代码中。如果答案有帮助,但您发现了更多问题,请创建一个新问题,而不是更改此问题。

标签: javascript node.js discord discord.js


【解决方案1】:

您似乎正在使用nhentai npm 包。问题是您正在生成一个介于 1 和 1,000,000 之间的随机数,而当前最大的 ID 有点超过 360,000。每当您生成更大的数字时,fetchDoujin() 会解析为 undefined,因此您需要检查 doujin 是否存在。

您应该始终处理承诺拒绝。如果一个方法可以抛出一个错误,你需要捕获它。要么使用 try/catch 块,要么在 .then() 方法之后添加一个 .catch() 方法。

添加一个更接近最后一个 ID 的最大数字可能是个好主意。

if (message.content.startsWith(prefix + 'nhr')) {
  let LAST_ID = 360000;
  //RANDOM PREFIX
  let rnumber = Math.floor(Math.random() * LAST_ID) + 1;
  if (message.channel.nsfw) {
    api
      .fetchDoujin(`${rnumber}`)
      .then((doujin) => {
        if (!doujin)
          return message.channel.send(`Oops, the random ID ${rnumber} is not valid...`);

        let exampleEmbed = new Discord.MessageEmbed()
          .setColor('#ce0606')
          .setTitle(doujin.titles.pretty)
          .setURL(`https://youtube.com/${rnumber}`)
          .addFields(
            { name: 'Digits', value: `${rnumber}` },
            {
              name: 'Tags',
              value: doujin.tags.all.map((tag) => tag.name).join(', '),
            },
          )
          .setImage(doujin.cover.url)
          .setFooter('x', 'x');
        message.channel.send(exampleEmbed);
      })
      .catch((err) => {
        message.channel.send('Oops, there was an error');
        console.log(err);
      });
  } else {
    let exampleEmbed = new Discord.MessageEmbed()
      .setColor('#ffc0cb')
      .setTitle('**x**')
      .setImage('x');
    message.channel.send(exampleEmbed);
  }
}

如果您仍然想使用used in your other questionnhentai-js 库,请确保将字符串传递给nhentai.getDoujin()(因为数字没有.replace() 方法):

if (message.content.startsWith(prefix + 'nhr')) {
  let LAST_ID = 360000;
  let chosenNum = Math.floor(Math.random() * LAST_ID) + 1;
  if (message.channel.nsfw) {
    try {
      const res = await nhentai.getDoujin(chosenNum.toString());
      const embed = new MessageEmbed()
        .setColor('#ce0606')
        .setTitle(res.title)
        .setImage(res.pages[0])
        .setURL(res.link)
        .addField('Pages', res.details.pages[0], true)
        .addField('Uploaded', res.details.uploaded[0], true)
        .setFooter('x', 'x');

      if (res.details.languages)
        embed.addField('Languages', res.details.languages.join(', '), true);
      if (res.details.characters)
        embed.addField(
          'Top characters',
          res.details.characters.slice(0, 10).join(', '),
          true,
        );
      if (res.details.tags)
        embed.addField(
          'Top tags',
          res.details.tags.slice(0, 10).join(', '),
          true,
        );

      return message.channel.send(embed);
    } catch (err) {
      console.log(err);
      return message.channel.send(
        'Oops, there was an error. Maybe try again?!',
      );
    }
  } else {
    const embed = new MessageEmbed()
      .setColor('#ffc0cb')
      .setTitle('**x**');
    return message.channel.send(embed);
  }
}

【讨论】:

  • 有没有办法让它随机化一个 1-6 位数字链 ex。 123456
  • 上面的代码就是这样做的。你的问题是366350以上没有同人,所以每当你生成一个比这个更大的数字时,API都会返回undefined。这就是我添加LAST_ID 的原因,这是目前可用的最大数字。
  • 好的,谢谢!我使用最新版本(上面编辑过)设置了代码,但现在我收到一条错误消息,指出“identifier.replace 不是函数”。不确定,但机器人会继续输出“糟糕,出现错误。也许再试一次?!”。你知道怎么解决吗? (已修复)
  • @ZsoltMeszaros 请注意,提问者不应在收到实质性答案后从根本上编辑问题。我几乎撤消了对该问题的最后一次编辑,但随后注意到您已经调整了答案。请鼓励 OP 将这个问题保持原样并由您回答,并针对任何新需求创建一个新问题。像上一个这样的另一个编辑肯定会将问题变成一个“移动目标”。您可以回滚此类编辑。如果你不想让我知道,我会为你做的。
  • 谢谢@Yunnosch,我已经回滚了编辑并且我也更新了我的答案。再次感谢。
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 2021-01-19
  • 2021-09-04
  • 2020-10-15
  • 1970-01-01
  • 2021-03-04
  • 2020-08-17
相关资源
最近更新 更多