Zum Inhalt springen
Aktueller Gutschein:10 % RabattIn der Bestellung einlösen

Discord-Bot: Logs, Neustarts und Fehlerbehebung

Wo Sie die Ausgabe Ihres Bots finden, wie der Neustart funktioniert, wie Sie Fehler abfangen, damit der Bot nicht abstürzt, und was die häufigsten Meldungen von Cannot find module bis Missing Permissions bedeuten.

  • Einsteiger
  • ~15 Min.
  • Aktualisiert am 9.10.2026

Wenn Ihr Bot nicht funktioniert, steht die Antwort fast immer in seiner Ausgabe. Wir zeigen Ihnen, wo Sie die Ausgabe finden, wie der automatische Neustart funktioniert, wie Sie Fehler im Code abfangen und was die häufigsten Meldungen bedeuten.

Was Sie brauchen

  • Ein Discord-Bot bei StormHost (oder auf Ihrem eigenen VPS)
  • Zugang zum Kundenbereich
  • Ein in Node.js geschriebener Bot; die Codebeispiele gelten für discord.js Version 14
  • Etwa 15 Minuten

Wo Sie die Logs finden#

Öffnen Sie im Kundenbereich Meine Dienste, klicken Sie auf Ihren Bot und bleiben Sie in der Registerkarte Konsole.

  • Die Konsole zeigt live alles, was der Bot ausgibt: console.log() und console.info() gehen in die Standardausgabe, console.error() und console.warn() in die Fehlerausgabe. Wenn die Anwendung abstürzt, sehen Sie hier ihre Ausgabe (einen Fehler mit einer Liste von Dateien und Zeilen, den sogenannten Stack-Trace).
  • Unter der Konsole sehen Sie die aktuelle Auslastung von CPU, RAM, Festplatte und Netzwerk.
  • Die Schaltflächen Start, Neustart und Stopp befinden sich in der Registerkarte Konsole, oberhalb der Konsole selbst.

Streamer-Modus

Die Bot-Konsole blendet IP-Adressen in der Ausgabe nur aus, wenn der Streamer-Modus eingeschaltet ist. Ihren Token oder Passwörter verbirgt sie jedoch nicht. Geben Sie diese nie in der Konsole aus und teilen Sie nie einen Screenshot, auf dem sie zu sehen sind. Mehr dazu in der Anleitung Kundenbereich.

Protokollierung in eine Datei#

Die Konsole zeigt nur den neuesten Teil der Ausgabe. Wenn Sie nachsehen möchten, was letzte Nacht passiert ist, schreiben Sie wichtige Ereignisse zusätzlich in eine Datei. Ein einfacher Helfer für CommonJS (require):

logger.jsJavaScript
const fs = require('node:fs');
const path = require('node:path');
const util = require('node:util');

const slozka = path.join(__dirname, 'logs');
fs.mkdirSync(slozka, { recursive: true });
const soubor = fs.createWriteStream(path.join(slozka, 'bot.log'), { flags: 'a' });

function zapis(uroven, ...casti) {
  const radek = `[${new Date().toISOString()}] ${uroven} ${util.format(...casti)}`;
  (uroven === 'ERROR' ? console.error : console.log)(radek);
  soubor.write(radek + '\n');
}

module.exports = {
  info: (...c) => zapis('INFO', ...c),
  warn: (...c) => zapis('WARN', ...c),
  error: (...c) => zapis('ERROR', ...c),
};
TeilWas er tut
fs.mkdirSync(slozka, { recursive: true })Legt den Ordner logs neben der Datei an, falls er nicht existiert.
createWriteStream(…, { flags: 'a' })Öffnet die Datei zum Anhängen am Ende (a = append); alte Einträge bleiben erhalten.
new Date().toISOString()Der Zeitpunkt des Ereignisses in UTC, zum Beispiel 2026-10-01T18:04:12.345Z.
util.format(...casti)Fügt die Teile der Nachricht genauso zusammen wie console.log. Bei einem Fehler schreibt es auch die Zeilenliste (Stack-Trace), bei einem Objekt dessen Inhalt.
console.error / console.logDie Zeile erscheint auch in der Konsole.
soubor.write(radek + '\n')Schreibt die Zeile in logs/bot.log.

Verwendung im Bot: const log = require('./logger'); und dann log.info('Bot ist bereit') oder log.error('Befehl fehlgeschlagen:', chyba). Die Datei logs/bot.log können Sie in der Registerkarte Dateien herunterladen. Löschen oder leeren Sie sie von Zeit zu Zeit, damit sie die Festplatte nicht füllt.

Automatischer Neustart#

Wenn der Bot abstürzt (der Prozess mit einem Fehler endet), startet er automatisch neu. Einen kurzen Ausfall bemerken Sie oft gar nicht, den Fehler sehen Sie aber in der Konsolenausgabe.

  • Wenn der Bot direkt nach dem Start immer wieder abstürzt, liegt der Fehler in Ihrem Code oder in den Einstellungen, und ein Neustart behebt ihn nicht. Lesen Sie den ersten Fehler in der Ausgabe, beheben Sie ihn und starten Sie den Bot mit der Schaltfläche Start.
  • Verwenden Sie process.exit() in Ihrem Code nicht als normalen Weg, den Bot zu beenden. Der Bot soll dauerhaft laufen.
  • Nutzen Sie Neustart nach dem Hochladen von neuem Code oder nach dem Ändern von Variablen in der Registerkarte Einstellungen; die Änderungen wirken erst nach einem Neustart.

Fehler abfangen, damit der Bot nicht abstürzt#

Node.js beendet den Prozess bei jedem Fehler, den niemand abfängt. Dazu gehört auch ein abgelehntes Promise ohne catch (Standardverhalten seit Node.js 15). Ein Fehler in einem Befehl kann den ganzen Bot zum Absturz bringen. Fügen Sie diese Listener in die Hauptdatei ein (zum Beispiel index.js):

index.jsJavaScript
const { Client, Events, GatewayIntentBits } = require('discord.js');

const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.on(Events.Error, (chyba) => console.error('discord.js-Client-Fehler:', chyba));
client.on(Events.Warn, (zprava) => console.warn('discord.js-Warnung:', zprava));
client.on(Events.ShardError, (chyba) => console.error('Discord-Verbindungsfehler:', chyba));

process.on('unhandledRejection', (duvod) => {
  console.error('Unbehandelte Promise-Ablehnung:', duvod);
});

process.on('uncaughtException', (chyba) => {
  console.error('Unbehandelte Ausnahme, der Bot wird beendet:', chyba);
  process.exit(1);
});
ListenerWann er ausgeführt wirdWarum Sie ihn brauchen
Events.ErrorDer discord.js-Client meldet einen Fehler.Ohne Listener beendet das Ereignis error den Prozess.
Events.WarnDer Client meldet eine Warnung.Warnt Sie vor einem Problem, bevor etwas abstürzt.
Events.ShardErrorEin Fehler in der Verbindung zum Discord-Gateway (Websocket).discord.js verbindet sich selbst neu; Sie sehen, warum es passiert ist.
unhandledRejectionEin Promise ist fehlgeschlagen und niemand hat den Fehler abgefangen (fehlendes await innerhalb von try oder fehlendes .catch()).Der Bot stürzt wegen eines vergessenen Fehlers nicht ab, und Sie sehen, woher er kam.
uncaughtExceptionEin synchroner Fehler, den nichts abgefangen hat.Gibt den Fehler aus und beendet den Bot. Nach einem solchen Fehler ist es nicht sicher weiterzumachen; der automatische Neustart startet den Bot in einem sauberen Zustand neu.

Fangen Sie Fehler in einzelnen Befehlen direkt im Interaktions-Handler ab, damit der Benutzer eine Antwort erhält und der Bot weiterläuft:

JavaScript
const { Events, MessageFlags } = require('discord.js');

client.on(Events.InteractionCreate, async (interaction) => {
  if (!interaction.isChatInputCommand()) return;

  try {
    await zpracujPrikaz(interaction);
  } catch (chyba) {
    console.error(`Befehl /${interaction.commandName} fehlgeschlagen:`, chyba);
    const odpoved = { content: 'Beim Ausführen dieses Befehls ist ein Fehler aufgetreten.', flags: MessageFlags.Ephemeral };
    if (interaction.replied || interaction.deferred) {
      await interaction.followUp(odpoved).catch(console.error);
    } else {
      await interaction.reply(odpoved).catch(console.error);
    }
  }
});
  • isChatInputCommand() – verarbeitet nur Slash-Befehle.
  • zpracujPrikaz(interaction) – Ihre Funktion mit der Befehlslogik.
  • try { … } catch (chyba) { … } – ein Fehler im Befehl landet in catch, statt den Bot abstürzen zu lassen.
  • MessageFlags.Ephemeral – nur der Benutzer, der den Befehl ausgeführt hat, sieht die Antwort.
  • interaction.replied || interaction.deferred – wenn der Bot bereits geantwortet oder die Antwort aufgeschoben hat, muss er die nächste Nachricht mit followUp senden, sonst mit reply.
  • .catch(console.error) – wenn selbst die Fehlerantwort fehlschlägt, wird sie nur ausgegeben.

Arbeitsspeicher#

Der Bot hat so viel RAM, wie Ihr Tarif vorsieht. Wenn er ausgeht, stürzt der Bot ab (und startet automatisch neu) oder wird deutlich langsamer. Eine typische Meldung beim Absturz:

Ausgabetext
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

Diese Meldung gibt Node.js selbst aus, wenn ihm der Speicher für JavaScript-Objekte ausgeht. Wenn das System den Prozess wegen des Speicherlimits beendet, kann die Ausgabe ganz ohne Fehlermeldung enden. In beiden Fällen hilft es herauszufinden, was den Speicher belegt (siehe unten).

Behalten Sie die Auslastung unter der Konsole im Auge oder lassen Sie den Bot sie ausgeben:

JavaScript
setInterval(() => {
  const mb = (b) => Math.round(b / 1024 / 1024);
  const m = process.memoryUsage();
  console.log(`Speicher: gesamt ${mb(m.rss)} MB, Heap ${mb(m.heapUsed)}/${mb(m.heapTotal)} MB`);
}, 10 * 60 * 1000);
  • process.memoryUsage() – die aktuelle Auslastung des Prozesses; rss ist der Gesamtspeicher, heapUsed der von JavaScript-Objekten belegte Speicher.
  • 10 * 60 * 1000 – gibt alle 10 Minuten aus (der Wert ist in Millisekunden).

Wenn der Speicher stetig wächst, sind die häufigsten Ursachen:

UrsacheLösung
discord.js hält Nachrichten, Mitglieder und andere Objekte im Speicher (Cache). Auf großen Servern sind das Zehntausende Einträge.Begrenzen Sie den Cache und lassen Sie alte Einträge entfernen (Beispiel unten). Aktivieren Sie den Intent GuildMembers nur, wenn Sie ihn brauchen, und laden Sie nicht ohne Grund alle Mitglieder (guild.members.fetch()).
Eigene Arrays oder Maps, die nur wachsen (Verlauf, Cooldowns, zwischengespeicherte Ergebnisse).Löschen Sie alte Einträge oder speichern Sie die Daten in einer Datenbank.
setInterval oder Event-Listener, die immer wieder hinzugefügt werden (zum Beispiel innerhalb eines Befehls-Handlers).Registrieren Sie Listener einmal beim Start.

Begrenzung des Caches in discord.js:

JavaScript
const { Client, GatewayIntentBits, Options } = require('discord.js');

const client = new Client({
  intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
  makeCache: Options.cacheWithLimits({
    ...Options.DefaultMakeCacheSettings,
    MessageManager: 50,
  }),
  sweepers: {
    ...Options.DefaultSweeperSettings,
    messages: { interval: 3_600, lifetime: 1_800 },
  },
});
  • makeCache: Options.cacheWithLimits({ … }) – begrenzt die Cache-Größe; MessageManager: 50 = höchstens 50 Nachrichten pro Kanal.
  • ...Options.DefaultMakeCacheSettings – belässt die übrigen Caches bei ihren Standardeinstellungen.
  • sweepers.messages – entfernt jede Stunde (interval: 3_600 Sekunden) Nachrichten, die älter als 30 Minuten sind (lifetime: 1_800), aus dem Cache.

Manche Caches nicht begrenzen

Die discord.js-Dokumentation warnt, dass die Begrenzung des Caches für GuildManager, ChannelManager, GuildChannelManager, RoleManager und PermissionOverwriteManager nicht unterstützt wird und Funktionen der Bibliothek beschädigt.

Wenn der Bot nach der Optimierung wirklich mehr Speicher braucht, wechseln Sie in der Registerkarte Tarif ändern zu einem größeren Tarif. Sie zahlen nur die Differenz bis zum Ende des Zeitraums; die Schritte stehen im Artikel Verlängerung und Upgrade.

Bot auf dem eigenen VPS#

Wenn Sie den Bot auf einem VPS betreiben, richten Sie ihn als systemd-Dienst ein. So bekommen Sie automatische Neustarts und den Start nach einem Neustart des VPS, und die Logs liegen im Systemjournal (journalctl -u <DIENSTNAME> -f). Schritte: Eine App rund um die Uhr mit systemd betreiben.

Fehlerbehebung#

Error: Cannot find module 'discord.js'#

Die Pakete sind nicht installiert (der Ordner node_modules fehlt oder das Paket ist nicht darin). Prüfen Sie, dass im Stammordner des Projekts eine package.json mit discord.js in den dependencies liegt. Wie Pakete auf unseren Servern installiert werden, beschreibt die Anleitung Hochladen und Starten des Bots.

Error: Cannot find module '…/index.js' oder './commands/ping.js'#

Node.js hat die Datei unter diesem Pfad nicht gefunden:

  • Die Hauptdatei hat einen anderen Namen oder liegt in einem anderen Unterordner, als die Starteinstellungen erwarten.
  • Groß- und Kleinschreibung: Windows unterscheidet sie nicht, der Linux-Server schon. require('./Commands/ping.js') findet auf dem Server den Ordner commands nicht. Gleichen Sie die Namen an.
  • Ein relativer Pfad wird von der Datei aus aufgelöst, die das require enthält, nicht vom Ordner, in dem der Bot startet. Verwenden Sie path.join(__dirname, …).

Error [ERR_REQUIRE_ESM]: require() of ES Module … not supported#

Sie laden mit require() ein Paket, das nur als ES-Modul existiert (zum Beispiel neuere Versionen mancher Bibliotheken). Lösungen:

  • Stellen Sie das Projekt auf ES-Module (import) um, siehe den nächsten Fehler.
  • Oder laden Sie das Paket dynamisch: const { default: library } = await import('package-name');.
  • Oder verwenden Sie eine ältere Version des Pakets, die CommonJS noch unterstützt.

Neuere Node.js-Versionen (20.19 und 22.12 und neuer) können ES-Module mit require() laden und melden diesen Fehler nur in älteren Versionen. Bei Modulen mit Top-Level-await melden sie ERR_REQUIRE_ASYNC_MODULE. Welche Node.js-Version Ihr Bot verwendet, erfahren Sie unter Node.js-Version.

ReferenceError: require is not defined in ES module scope, you can use import instead#

Das Projekt ist als ES-Module eingerichtet ("type": "module" in package.json oder eine Datei mit der Endung .mjs), der Code verwendet aber require(). Schreiben Sie entweder require in import um (import { Client } from 'discord.js';) oder entfernen Sie "type": "module" aus package.json. Auch __dirname funktioniert in ES-Modulen nicht; verwenden Sie import.meta.dirname (Node.js 20.11 und neuer).

SyntaxError: Cannot use import statement outside a module#

Das Gegenteil des vorherigen Fehlers: Der Code verwendet import, das Projekt ist aber CommonJS (typischerweise "type": "commonjs" in package.json). Fügen Sie "type": "module" in package.json ein oder verwenden Sie require(). Mischen Sie beides nicht in einem Projekt.

SyntaxError: Unexpected token (zum Beispiel '?' oder '.')#

Der Code verwendet eine Syntax, die die Node.js-Version auf dem Server noch nicht unterstützt. Ermitteln Sie die Version (console.log(process.version) am Anfang des Bots) und vergleichen Sie sie mit den Anforderungen Ihrer Bibliotheken: discord.js 14 benötigt Node.js 18 oder neuer. Schritte: Node.js-Version.

Error: Used disallowed intents#

Der Bot fordert einen privilegierten Intent an, der im Discord Developer Portal nicht aktiviert ist. Öffnen Sie das Developer Portal (öffnet sich in einem neuen Fenster), Ihre Anwendung und den Abschnitt Bot, und schalten Sie unter Privileged Gateway Intents ein, was der Bot tatsächlich nutzt (Presence Intent, Server Members Intent, Message Content Intent). Oder entfernen Sie den Intent aus dem Code. Details: Token und Intents.

An invalid token was provided. (TokenInvalid)#

Der Token ist falsch, wurde ungültig (nach Reset Token im Developer Portal) oder ist nie in den Bot geladen worden (die Umgebungsvariable ist leer, die Datei .env fehlt oder wird nicht geladen). Geben Sie zur Prüfung nur die Länge des Tokens aus, nie den ganzen Token: console.log('Token-Länge:', process.env.DISCORD_TOKEN?.length);. Verwenden Sie den Variablennamen, den Sie in Ihrem Code haben. Schritte: Token und Intents.

DiscordAPIError[50013]: Missing Permissions#

Der Bot hat keine Berechtigung für die Aktion (Nachricht senden, Rolle vergeben, Nachricht löschen, bannen):

  • Prüfen Sie die Rollen des Bots in den Einstellungen des Discord-Servers und die Berechtigungen in dem Kanal (ein Kanal kann Berechtigungen überschreiben).
  • Reihenfolge der Rollen: Der Bot kann nur Rollen verwalten, die in der Rollenliste unter seiner höchsten Rolle stehen. Ziehen Sie die Rolle des Bots weiter nach oben.
  • Den Serverinhaber kann der Bot in keiner Weise verändern.

DiscordAPIError[50001]: Missing Access#

Der Bot sieht den Kanal oder den Server nicht: Er hat im Kanal nicht die Berechtigung View Channel, ist gar nicht auf dem Server, oder Sie registrieren Befehle für einen Server mit falscher ID (auf dem der Bot nicht ist). Wenn jemand den Bot vor langer Zeit nur mit dem Scope bot eingeladen hat und die Befehlsregistrierung immer wieder fehlschlägt, laden Sie ihn erneut mit einem Link ein, der die Scopes bot und applications.commands enthält.

DiscordAPIError[10062]: Unknown interaction#

Eine Interaktion (Slash-Befehl, Schaltfläche) muss innerhalb von 3 Sekunden beantwortet werden. Wenn ein Befehl länger dauert (Datenbank, API), rufen Sie gleich am Anfang await interaction.deferReply(); auf und senden Sie das Ergebnis später mit interaction.editReply(…). Eine aufgeschobene Antwort bleibt 15 Minuten gültig.

Derselbe Fehler (oder DiscordAPIError[40060]: Interaction has already been acknowledged) tritt auch auf, wenn zwei Kopien des Bots mit demselben Token laufen, zum Beispiel eine auf unseren Servern und eine weitere auf Ihrem Computer. Beide versuchen zu antworten. Lassen Sie nur eine laufen.

ECONNRESET, ETIMEDOUT, EAI_AGAIN#

Ein vorübergehender Netzwerkausfall oder eine abgebrochene Verbindung zu Discord. discord.js verbindet sich selbst wieder mit dem Gateway und wiederholt fehlgeschlagene REST-API-Anfragen mehrmals. Wenn der Fehler über längere Zeit immer wieder auftritt, prüfen Sie unseren Dienststatus und den Status von Discord (discordstatus.com (öffnet sich in einem neuen Fenster)).

Der Bot ist langsam und in der Ausgabe steht 429 oder ein Rate-Limit#

Discord begrenzt die Anzahl der Anfragen (global 50 pro Sekunde pro Bot, dazu weitere Limits für einzelne Aktionen). Wird ein Limit überschritten, wartet discord.js automatisch und sendet die Anfrage später, weshalb der Bot „langsamer wird“. Senden Sie Nachrichten, Rollen oder Bearbeitungen nicht massenhaft in einer Schleife.

Wiederholte ungültige Anfragen = Sperre der IP-Adresse

Wenn ein Bot innerhalb von 10 Minuten 10 000 ungültige Anfragen sendet (Antworten 401, 403 oder 429), sperrt Discord die IP-Adresse vorübergehend. Ursache ist typischerweise eine Schleife, die eine Aktion ohne Berechtigung oder mit falschem Token immer wieder versucht. Beheben Sie einen solchen Fehler sofort, nicht mit einem Neustart.

Der Bot ist online, reagiert aber nicht auf Nachrichten#

Um Nachrichteninhalte zu lesen (messageCreate und message.content), braucht der Bot im Code die Intents GuildMessages und MessageContent sowie den im Developer Portal aktivierten Message Content Intent. Ohne ihn ist message.content leer. Verwenden Sie für Befehle stattdessen Slash-Befehle, die diesen Intent nicht brauchen (erster discord.js-Bot).

Der Bot ist offline#

  1. Sehen Sie in der Registerkarte Konsole nach: Läuft der Bot oder ist er gestoppt? Wenn er gestoppt ist, starten Sie ihn mit der Schaltfläche Start.
  2. Wenn er startet und sofort abstürzt, lesen Sie den ersten Fehler in der Ausgabe und suchen Sie ihn oben.
  3. Wenn er ohne Fehler läuft, aber offline ist, prüfen Sie den Token (nach einem Token-Reset funktioniert der alte nicht mehr und der Bot kann sich nicht anmelden).

Nichts davon hat geholfen: wann Sie den Support kontaktieren#

Kontaktieren Sie uns (Kontakte), wenn:

  • die Konsole nicht lädt oder die Schaltflächen Start und Neustart nicht reagieren,
  • der Bot selbst mit minimalem Code nicht startet, der anderswo funktioniert,
  • Sie eine andere Node.js-Version oder mehr Speicher brauchen.

Senden Sie uns den Namen oder die ID des Dienstes, den Zeitpunkt des Problems und die genaue Fehlermeldung (den aus der Konsole kopierten Text). Senden Sie nie den Bot-Token.

Zusammenfassung

  • Die Ausgabe des Bots finden Sie in der Registerkarte Konsole; für den Verlauf schreiben Sie sie zusätzlich in eine Datei.
  • Der Bot startet nach einem Absturz von selbst neu; stürzt er direkt nach dem Start ab, liegt die Lösung im Code.
  • Die Listener Events.Error und unhandledRejection sowie try/catch in Befehlen verhindern, dass ein Fehler den Bot abstürzen lässt.
  • Used disallowed intents und TokenInvalid beheben Sie im Developer Portal, Missing Permissions in den Rollen auf dem Discord-Server.
  • Unknown interaction = eine verspätete Antwort (verwenden Sie deferReply) oder zwei laufende Kopien des Bots.

Anleitungen durchsuchen