1. ホーム
  2. ジャバスクリプト

[解決済み】Discord Jsで未定義のプロパティタイトルが読めない。

2022-03-17 16:59:52

質問

私が作っているDiscordボットで乱数発生器を作るとき、誰かが +nhr というエラーメッセージがコンソールに表示されます。

<ブロッククオート

TypeError: 未定義のプロパティ 'titles' を読み取ることができません。

そして

Unhandled Promise rejection(未処理のプロミス拒否)です。このエラーは キャッチブロックのない非同期関数の内部で、またはリジェクトされた .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);
  }
}

(他に必要なものがあれば、コメントください)

解決方法は?

を使用しているようです。 nhentai npm パッケージを使用します。問題は、1から1,000,000までの乱数を生成しているのですが、現在の最大のIDは36万を少し超えるものです。もっと大きな数字を生成しているときは必ず 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);
  }
}

それでもまだ nhentai-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);
  }
}