De fout "discord application did not respond" die verschijnt wanneer je een slash-commando uitvoert, is een van de meest voorkomende — maar ook makkelijkst op te lossen — problemen in Discord-botontwikkeling. Het bericht betekent zelden dat je bot "stuk" is; het betekent dat de bot niet op tijd antwoordde. Discord verwacht de eerste reactie op een interactie binnen 3 seconden, en zodra dat venster sluit, toont het de gebruiker deze fout, ongeacht wat je bot daarna doet. In deze gids leg ik de echte oorzaak uit, de 3-secondenregel, en hoe je je timing goed regelt met defer.
De 3-secondenregel: de echte oorzaak
Wanneer een gebruiker een slash-commando uitvoert, op een knop klikt of een menu-optie kiest, stuurt Discord een interactie naar je bot. Die interactie draagt een kortlevend "token", en Discord wacht op de eerste reactie binnen 3 seconden. Stuur je niets in dat venster, dan verklaart Discord de interactie ongeldig en toont het de gebruiker de waarschuwing Application did not respond. Zelfs als je code even later succesvol afrondt, kun je niet meer op die interactie reageren, want het token is al gesloten.
Het belangrijke onderscheid: de limiet van 3 seconden geldt alleen voor de eerste reactie. Zodra je die eerste reactie hebt gegeven — bijvoorbeeld door een "aan het nadenken"-status te openen — heb je ongeveer 15 minuten om het antwoord te bewerken. Je kunt dus zeker langdurige taken uitvoeren; je moet alleen binnen die eerste 3 seconden het signaal "er komt een antwoord" geven.
Tijd winnen met defer
Telkens als een bewerking langer dan 3 seconden kan duren, moet je defer gebruiken. Deferren zegt tegen Discord "ik bereid een antwoord voor, wacht even" en toont de gebruiker de denk-indicator van de bot, zodat het venster nooit sluit.
Een typisch patroon met discord.js (v14) ziet er zo uit:
module.exports = {
data: new SlashCommandBuilder()
.setName('stats')
.setDescription('Haalt serverstatistieken op'),
async execute(interaction) {
// Bevestig voordat de 3 seconden om zijn
await interaction.deferReply();
// Werk dat even kan duren: database / API-aanroep
const data = await fetchStats(interaction.guildId);
// Bewerk de eerste reactie zodra die klaar is
await interaction.editReply(`Totaal aantal leden: ${data.memberCount}`);
},
};
In discord.py is de logica identiek; alleen de API verschilt:
@tree.command(name="stats", description="Serverstatistieken")
async def stats(interaction: discord.Interaction):
await interaction.response.defer() # voldoe aan de 3-secondenregel
data = await fetch_stats(interaction.guild_id)
await interaction.followup.send(f"Totaal aantal leden: {data['member_count']}")
Wanneer gebruik je reply, editReply en followUp
Het door elkaar halen van de reactiemethodes veroorzaakt ook deze fout of andere conflicten. Een eenvoudige set regels dekt bijna elk geval:
- Snel werk (< 3 s): roep direct
interaction.reply()aan — geen defer nodig. - Traag werk: eerst
deferReply(), vul daarna de eerste reactie meteditReply(). - Extra berichten: gebruik
followUp()na de eerste reactie. - Alleen voor de gebruiker zichtbaar: markeer het als ephemeral bij het deferren. Op discord.js v14.9+ gebruik je
flags: MessageFlags.Ephemeral; op oudere versies{ ephemeral: true }.
Je kunt de eerste reactie op een interactie maar één keer geven. Roep je reply() opnieuw aan na reply() of deferReply(), dan krijg je de fout "already been acknowledged"; vanaf dat punt moet je editReply() of followUp() gebruiken.
Wanneer je commando's niet geregistreerd zijn
Soms is het probleem geen timing — maar dat de commando's nooit bij Discord zijn geregistreerd. Een oude commando-definitie blijft in de cache, je schrijft nieuwe code, maar Discord roept de oude definitie aan en bereikt nooit de relevante tak van je code, dus er gaat geen reactie uit. Je moet commando's bij elke wijziging registreren:
const rest = new REST().setToken(process.env.TOKEN);
await rest.put(
Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID),
{ body: commands },
);
console.log('Commando's geregistreerd.');
Gebruik tijdens de ontwikkeling guild-commando's (serverniveau): die worden direct bijgewerkt. Globale commando's worden naar alle servers uitgerold, maar de verspreiding kan even duren.
Vang de stille fouten op
Het geniepigste geval is een fout die wordt opgeworpen tussen defer en editReply. De code crasht, editReply draait nooit, en de gebruiker blijft hangen op de denk-indicator of ziet een fout. Wikkel de hele commando-body in een try/catch en zet de fout om in een zichtbare reactie:
async execute(interaction) {
await interaction.deferReply();
try {
const data = await risicovolleBewerking();
await interaction.editReply(data.message);
} catch (err) {
console.error(err);
await interaction.editReply('Er ging iets mis, wil je het opnieuw proberen?');
}
}
Kijk altijd in je logs: de echte oorzaak verbergt zich daar meestal (database-timeout, ontbrekende intent, een null-waarde).
Snelle checklist
- Is de bot echt online en is het token correct?
- Heb je
deferReply()/defer()aangeroepen vóór de lange bewerking? - Gebruik je
editReply/followUpna de eerste reactie? - Zijn de commando's bij Discord geregistreerd (vooral guild-commando's)?
- Is de code beschermd met
try/catchen lees je de logs? - Zijn de vereiste gateway intents ingeschakeld?
Veelgestelde vragen
Ik heb gedeferd maar krijg nog steeds "application did not respond", waarom?
Hoogstwaarschijnlijk draait je deferReply()-aanroep na de 3 seconden; er staat bijvoorbeeld een trage database-query vóór de defer. Plaats de defer helemaal bovenaan het commando, vóór al het zware werk. Het kan ook zijn dat de defer-aanroep zelf niet await wordt of een fout opwerpt.
Hoeveel tijd heb ik om het antwoord te bewerken na de 3 seconden?
Na het deferren blijft het interactie-token ongeveer 15 minuten geldig. Binnen die tijd kun je reacties sturen met editReply en followUp. Voor taken langer dan 15 minuten gebruik je beter een gewoon kanaalbericht.
Gelden knop- en menu-interacties onder dezelfde regel?
Ja. Knoppen, keuzemenu's en modal-inzendingen zijn allemaal interacties en volgen dezelfde 3-secondenregel. Duurt het werk even, dan moet je ze ook deferren.
Loopt je bot nog steeds vast? Ik kan de interactieflow, commando-registratie en timing van begin tot eind opzetten zodat je bot betrouwbaar blijft. Neem contact op en we lossen het samen op.