Search code examples
node.jsdiscorddiscord.jsruntime-error

DiscordAPIError: Invalid Form Body embeds[0].description: This field is required in discord.js v13


So I'm coding this discord bot using discord.js v13 right and it was all going fine until for some reason I started to get this runtime error concerning my embed's description.

What happens is that 3 buttons work, except for the last one (the one that's supposed to go to the very last page).

Here is my code:

import {
    Interaction,
    Message,
    MessageActionRow,
    MessageButton,
    MessageEmbed,
} from 'discord.js'
import { ICommand } from 'wokcommands'

export default {
    category: 'Testing',
    description: 'Creates an embed pagination',

    slash: 'both',
    testOnly: true,

    callback: async ({ user, message, interaction, channel }) => {

        const embeds: MessageEmbed[] = []
const pages = {} as { [key: string]: number }

for (let i = 0; i < 4; ++i) {
    embeds.push(new MessageEmbed()
    .setDescription(`Testing page ${i + 1}`))
}

const getRow = (id: string) => {
    const row = new MessageActionRow()

    row.addComponents(
        new MessageButton()
        .setCustomId('first_embed')
        .setStyle('SECONDARY')
        .setEmoji('⏮')
        .setDisabled(pages[id] === 0)
    )

    row.addComponents(
        new MessageButton()
        .setCustomId('prev_embed')
        .setStyle('SECONDARY')
        .setEmoji('⏪')
        .setDisabled(pages[id] === 0)
    )

    row.addComponents(
        new MessageButton()
        .setCustomId('next_embed')
        .setStyle('SECONDARY')
        .setEmoji('⏩')
        .setDisabled(pages[id] === embeds.length - 1)
    )

    row.addComponents(
        new MessageButton()
        .setCustomId('last_embed')
        .setStyle('SECONDARY')
        .setEmoji('⏭')
        .setDisabled(pages[id] === embeds.length - 1)
    )

    return row
}

        const id = user.id
        pages[id] = pages[id] || 0

        const embed = embeds[pages[id]]
        let reply: Message | undefined
        let collector

        const filter = (i: Interaction) => i.user.id === user.id
        const time = 1000 * 60 * 5

        if (message) {
            reply = await message.reply({
                embeds: [embed],
                components: [getRow(id)],
            })

            collector = reply.createMessageComponentCollector({ filter, time })
        } else {
            interaction.reply({
                ephemeral: true,
                embeds: [embed],
                components: [getRow(id)],
            })

            collector = channel.createMessageComponentCollector({ filter, time })
        }
        
        collector.on('collect', (btnInt) => {
            if (!btnInt) {
                return
            } 

            btnInt.deferUpdate()

            if (btnInt.customId !== 'prev_embed' && btnInt.customId !== 'next_embed' && btnInt.customId !== 'first_embed' && btnInt.customId !== 'last_embed') {
                return
            }

            console.log(embeds.length - 1)
            console.log(embeds.length)
            console.log(pages[id])

            if (btnInt.customId === 'prev_embed' && pages[id] > 0) {
                --pages[id]
            } else if (btnInt.customId === 'next_embed' && pages[id] < embeds.length - 1) {
                ++pages[id]
            } else if (btnInt.customId === 'first_embed' && pages[id] > 0) {
                pages[id] = 0
            } else if (btnInt.customId === 'last_embed' && pages[id] < embeds.length - 1) {
                pages[id] = embeds.length
            }

            if (reply) {
                reply.edit({
                    embeds: [embeds[pages[id]]],
                    components: [getRow(id)]
                })
            } else {
                interaction.editReply({
                    embeds: [embeds[pages[id]]],
                    components: [getRow(id)]
                })
            }
        })
    }
} as ICommand

Error: DiscordAPIError: Invalid Form Body embeds[0].description: This field is required

The bot breaks as soon as I click the "last" button...


Solution

  • // ...
    } else if (btnInt.customId === 'last_embed' && pages[id] < embeds.length - 1) {
      pages[id] = embeds.length
    }
    // ...
    

    This code appears to be setting the page to embeds.length. You probably want to set the page to embeds.length - 1, since arrays are zero-indexed.