Erreurs Courantes
Il ne fait aucun doute que vous avez rencontré des erreurs lors de la création de bots. Bien que les erreurs soient utiles pour vous avertir de ce qui ne va pas, beaucoup de gens sont déconcertés par elles et comment les dépistage et les corriger, mais ne vous inquiétez pas, nous vous couvrons. Cette section portera entièrement sur le diagnostic des erreurs, l'identification de leur origine et leur résolution.
Types d'Erreurs
Erreurs API
Les erreurs API ou DiscordAPIErrors sont lancées par l'API Discord lorsqu'une demande invalide est effectuée. Les erreurs API peuvent généralement être diagnosticées à l'aide du message qui est donné. Vous pouvez examiner davantage les erreurs en inspectant la méthode HTTP et le chemin utilisés. Nous explorerons le dépistage de ces erreurs dans la section suivante.
Exemple : DiscordAPIError: Cannot send an empty message
Erreurs discord.js
Les erreurs discord.js sont lancées par la bibliothèque elle-même. Elles peuvent généralement être facilement dépistées à l'aide de la trace de pile et du message d'erreur.
Exemple : The messages must be an Array, Collection, or number.
Erreurs JavaScript
Les erreurs JavaScript sont lances par node lui-même ou par discord.js. Ces erreurs peuvent facilement être réparées en regardant le type d'erreur et la trace de pile. Vous pouvez trouver une liste complète des types ici et une liste des erreurs JavaScript courantes ici.
Exemples :
ReferenceError: "x" is not definedCannot read properties of null (reading 'something')
Erreurs WebSocket et réseau
Les erreurs WebSocket et réseau sont des erreurs système courantes lancées par Node en réponse à quelque chose qui ne va pas avec la connexion WebSocket. Malheureusement, ces erreurs n'ont pas de solution concrète et peuvent être (généralement) réparées en obtenant une connexion meilleure, plus stable et plus robuste. discord.js essaiera automatiquement de se reconnecter au WebSocket si une erreur se produit.
Dans la version 12, les erreurs WebSocket sont gérées en interne, ce qui signifie que votre processus ne devrait jamais planter à cause d'elles. Si vous souhaitez enregistrer ces erreurs, le cas échéant, vous pouvez écouter l'événement shardError comme indiqué ci-dessous.
client.on(Events.ShardError, (error) => {
console.error('Une connexion websocket a rencontré une erreur :', error);
});Les codes couramment levés pour ces erreurs sont :
ECONNRESET- La connexion a été fermée de force par un pair, lancée par la perte de connexion à un WebSocket en raison d'un délai ou d'un redémarrage.ETIMEDOUT- Une demande de connexion ou d'envoi a échoué car la partie réceptrice n'a pas répondu après un certain temps.EPIPE- Le côté distant du flux en cours d'écriture a été fermé.ENOTFOUND- Le domaine accédé est indisponible, généralement causé par un manque d'Internet, peut être lancé par le WebSocket et l'API HTTP.ECONNREFUSED- La machine cible a refusé la connexion ; vérifiez vos ports et pare-feu.
Comment diagnostiquer les erreurs API
Les erreurs API peuvent être identifiées en ajoutant un écouteur d'événement pour les rejets non gérés et en regardant les informations supplémentaires. Cela peut être fait en ajoutant ceci à votre fichier principal.
process.on('unhandledRejection', (error) => {
console.error('Rejet de promesse non géré :', error);
});La prochaine fois que vous obtiendrez l'erreur, elle affichera des informations en bas de l'erreur qui ressembleront à quelque chose comme ceci par exemple :
name: 'DiscordAPIError',
message: 'Invalid Form Body\nmessage_id: Value "[object Object]" is not snowflake.',
path: '/api/v10/channels/638200642359525387/messages/[object%20Object]',
code: 50035,
method: 'GET'Toutes ces informations peuvent vous aider à identifier ce qui a causé l'erreur et comment la réparer. Dans cette section, nous expliquons ce que chaque propriété signifie.
Message
La partie la plus importante de l'erreur est le message. Il vous dit ce qui s'est passé, ce qui peut vous aider à identifier d'où cela provient. Vous pouvez trouver une liste complète des messages ici dans la documentation de l'API Discord.
Chemin
Une autre information utile est le chemin, qui vous indique le point de terminaison API sur lequel l'erreur s'est produite. Nous ne pouvons pas couvrir tous les points de terminaison, mais ils sont généralement très descriptifs.
Dans l'exemple ci-dessus, le chemin vous indique que l'action a été exécutée dans la portée /channels/. Le numéro que vous voyez ensuite est l'id du canal. Ensuite, vous pouvez repérer la portée message/. Le numéro est à nouveau l'id de l'objet. Combiné avec la méthode GET, vous pouvez conclure que le bot a essayé de récupérer le message avec l'id [object Object] du canal avec l'id 638200642359525387.
Comme le message d'erreur vous l'indique, [object Object] n'est pas un id valide, donc maintenant vous savez où chercher une erreur ! Découvrez où vous passez un objet comme id en essayant de récupérer un message et corrigez votre code à cet endroit.
Code
Le code est une autre représentation partielle du message, dans ce cas, Invalid Form Body. Vous pouvez trouver une liste complète des codes ici
Le code est également utile si vous souhaitez ne gérer qu'une erreur spécifique. Disons que vous essayez de supprimer un message qui peut ou non être là, et vous voulez ignorer les erreurs de message inconnu. Cela peut être fait en vérifiant le code, soit manuellement soit en utilisant les constantes discord.js.
message.delete().catch((error) => {
// Ne enregistrez l'erreur que si ce n'est pas une erreur de message inconnu
if (error.code !== 10_008) {
console.error('Échec de la suppression du message :', error);
}
});Ou en utilisant les constantes :
const { RESTJSONErrorCodes } = require('discord.js');
message.delete().catch((error) => {
if (error.code !== RESTJSONErrorCodes.UnknownMessage) {
console.error('Échec de la suppression du message :', error);
}
});Vous pouvez trouver une liste de constantes ici.
Méthode
Le dernier élément d'information peut vous en dire beaucoup sur ce que vous avez essayé de faire sur le chemin. Il y a un ensemble de mots-clés prédéfinis qui décrivent nos actions sur le chemin.
GET - Utilisé pour récupérer une donnée
POST - Utilisé pour envoyer une donnée
PATCH - Utilisé pour modifier une donnée
PUT - Utilisé pour remplacer complètement une donnée
DELETE - Utilisé pour supprimer complètement une donnéeDans cet exemple particulier, vous pouvez voir que vous essayez d'accéder à une donnée, spécifiquement, un message.
Common discord.js and API errors
An invalid token was provided.
This is a prevalent error; it originates from a wrong token being passed into client.login(). The most common causes of this error are:
- Not importing the config or env file correctly
- Copying the client secret instead of the bot token (the token is alphanumerical and three parts delimited by a period while the client secret is significantly smaller and one part only)
- Not updating the token after resetting it
Before the release of version 12, there used to be an issue where the token was not prefixed correctly, which resulted in valid tokens being marked as invalid. If you have verified that all of the above is not the case, make sure you have updated discord.js to the current stable version.
Request to use token, but token was unavailable to the client.
This error originates from the client attempting to execute an action that requires the token but the token not being available. This is most commonly caused by destroying the client and then trying to perform an action.
This error is also caused by attempting to use a client that has not logged in. Both of the examples below will throw errors.
const { Client, GatewayIntentBits } = require('discord.js');
// Should not be here!
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
module.exports = (interaction) => {
const id = interaction.options.getString('id');
// Should be `interaction.client` instead!
client.users.fetch(id).then((user) => {
interaction.reply(`Your requested user: ${user.tag}`);
});
};const { Client, Events, GatewayIntentBits } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.on(Events.InteractionCreate, someHandlerFunction);
client.login('your-token-goes-here');
// client will not be logged in yet!
client.users.fetch('myId').then(someInitFunction);EmbedBuilder field values may not be empty.
This error originates from calling EmbedBuilder#addFields() with a field object's name property as an empty string. If you would like the title to be empty for a reason, you should use a zero width space, which can be input as \u200b.
In conjunction with the previous error, this error results from calling EmbedBuilder#addFields() with a field object's value property as an empty string. You can use a zero-width space if you would like this blank.
The messages must be an Array, Collection, or number.
This error originates from an invalid call to bulkDelete(). Make sure you are inputting a valid Array or Collection of messages or a valid number.
Les membres n'ont pas arrivé à temps.
Cette erreur se produit lors de l'extraction de plusieurs membres via GuildMemberManager#fetch() et :
- L'intent
GuildMembersn'est pas spécifié ou activé dans le tableau de bord de développement - La connexion Internet est un peu mauvaise
- Le nombre de membres récupérés est élevé (environ 50 000 et plus)
Vous pouvez spécifier le temps d'attente avec l'option time dans l'appel .fetch(). Une autre solution pourrait être de déplacer votre bot vers une infrastructure plus rapide, si disponible.
MaxListenersExceededWarning: Fuite de mémoire EventEmitter détectée...
Cette erreur est causée par la création d'un grand nombre d'écouteurs d'événements, généralement pour le client. La cause la plus courante est d'imbriquer vos écouteurs d'événements au lieu de les séparer. La façon de corriger cette erreur est de s'assurer que vous n'imbriquez pas vos écouteurs ; ce n'est pas d'utiliser emitter.setMaxListeners() comme l'erreur le suggère.
Vous pouvez déboguer ces messages de différentes façons :
- Via la CLI:
node --trace-warnings index.js - Via l'événement
process#warning:process.on('warning', console.warn);
Impossible d'envoyer des messages à cet utilisateur.
Cette erreur se produit lorsque le bot essaie d'envoyer un message DM à un utilisateur mais ne peut pas le faire. Plusieurs raisons causent cela :
- Le bot et l'utilisateur ne partagent pas une guilde (souvent, les gens essaient de DM l'utilisateur après l'avoir expulsé ou banni).
- Le bot essaie de DM un autre bot.
- L'utilisateur a bloqué le bot.
- L'utilisateur a désactivé les DM dans les paramètres de confidentialité.
Dans le cas des deux dernières raisons, l'erreur n'est pas évitable, car l'API Discord ne fournit pas de moyen de vérifier si vous pouvez envoyer un DM à un utilisateur jusqu'à ce que vous essayiez d'en envoyer un. La meilleure façon de gérer cette erreur est d'ajouter un .catch() où vous essayez de DM l'utilisateur et soit ignorer la Promise rejetée soit faire ce que vous voulez à cause de cela.
Erreurs miscellannées courantes
code ENOENT... syscall spawn git.
Cette erreur est couramment lancée par votre système car il ne trouve pas git. Vous devez installer git ou mettre à jour votre chemin si git est déjà installé. Voici les liens de téléchargement :
- Ubuntu/Debian:
sudo apt-get install git - Windows: git-scm
code ELIFECYCLE
Cette erreur est couramment lancée par votre système en réponse à la fermeture inattendue du processus. Le nettoyage du cache npm et la suppression de node_modules peuvent généralement le corriger. Les instructions pour ce faire sont les suivantes :
- Nettoyer le cache npm avec
npm cache clean --force - Supprimer
node_modules - Supprimer
package-lock.json(assurez-vous que vous avez unpackage.json!) - Exécuter
npm installpour réinstaller les packages depackage.json