Partage
  • Partager sur Facebook
  • Partager sur Twitter

Discord.js message d'erreur

Comment signaler a un utilisateur qu'une erreur est survenue ?

Sujet résolu
8 avril 2021 à 11:17:31

Bonjour, je fais un bot discord et celui ci comporte un fichier JSON avec des données a l'intérieur. Le but: avec une command, récupérer une donnée stocker dans ce fichier JSON. J'aimerais que si le fichier JSON n'existe pas, mon bot prévienne l'utilisateur.

Voici mon code:

const anime = require("./anime_list.json")   

 if(message.content.startsWith("_anime")){

        const link = anime[args[1]]["s" + args[2]]["ep" + args[3]]

        if(!args[1] || !anime[args[1]] || !args[2] || !anime[args[1]]["s" + args[2]] || !args[3] || !anime[args[1]]["s" + args[2]]["ep" + args[3]]) msg("Sois la commande est erronnée, sois l'anime demandé n'est pas present dans nos bases de données. Si vous souhaitez l'obtenir, contactez nous a cet adresse: https://discord.com/channels/@me/454939105411858432")
        
        message.author.createDM().then(channel => channel.send(link)).catch(channel => channel.send("Une erreur est survenue"))

        message.delete()
    }

Et voici mon fichier JSON:

{
    "rezero":{
        "s1":{
            "ep1": "https://drive.google.com/file/d/1wWvjwNcDs5cdphbC0sbIFkQ-zTkdOtx3/view?usp=sharing",
            "ep2": "https://drive.google.com/file/d/1s3-EKB6cN7ugTgb3jofefh5Tr5Z_WbZS/view?usp=sharing",
            "ep3": "https://drive.google.com/file/d/1gHjREX8TzVHMSNi7LyUJJ6O_IkreGhBt/view?usp=sharing",
            "ep4": "https://drive.google.com/file/d/15WLyg2wfNfWGPMcY8M4gHG5PZ8fDYze9/view?usp=sharing",
            "ep5": "ATTENTION ! Il y a un passage après l'ending !\nhttps://drive.google.com/file/d/10Dtg2NbnKq0z5VDUeYmKOUQb-26EyqrD/view?usp=drivesdk",
            "ep6": "https://drive.google.com/file/d/10JQej1_qnjXB88nULYnvsrUm7JtBO7Yf/view?usp=drivesdk",
            "ep7": "https://drive.google.com/file/d/11pOjEkpW7x9SZAtmHW7eMKeYCu1QrGEe/view?usp=drivesdk",
            "ep8": "https://drive.google.com/file/d/11wm-iE0qm2v7gDQPALpK0NTB8HlVjy1f/view?usp=drivesdk"
        },
        "infos":{
            "Titre": "Re:Zero − Re:vivre dans un autre monde à partir de zéro",
            "Titre original": "(Re:Zero kara hajimeru isekai seikatsu)",
            "Titre original (Kanji)": "Re:ゼロから始める異世界生活",
            "Logo": "https://static.wikia.nocookie.net/wiki-rezero/images/3/34/Re_Zero_kara_Hajimeru_Isekai_Seikatsu_logo.png/revision/latest/scale-to-width-down/200?cb=20170731234038&path-prefix=fr",
            "Description": "Il s'agit de l'adaptation du roman Re:Zero de Nagatsuki Tappei et de Ootsuka Shinichirou.\nUn jour un jeune homme nommé Natsuki Subaru, à la sortie d'une supérette, est transporté dans un monde parallèle sans aucune explication. En essayant de comprendre pour quoi il se trouve ici, Subaru est attaqué par une bande de brigands mais est sauvé par une jeune fille : Emilia. Pour la remercier de l'aide qu'elle lui a fourni, il décide à son tour de l'aider à retrouver une voleuse qui lui a dérobé quelque chose.\nUn beau jour, Emilia et Subaru sont attaqués et tués par une mystérieuse personne. Cependant, Subaru se réveille au lieu et au jour où il est arrivé dans ce monde. C'est à ce moment-là qu'il se rend compte qu'il peut retourner dans le passé après être mort.\nPour échapper à son funeste destin, Subaru décide d'utiliser son pouvoir pour sauver Emilia et pour se sauver lui-même."
        }
    
    }
    
}


Merci d'avance ^^

-
Edité par LéoJason 8 avril 2021 à 11:17:58

  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2021 à 11:10:56

Bonjour, qu'elle et le comportement actuel de ton script ?

J'imagine que si tu le poses ici il ne fonctionnent pas comme prévue, mais est-ce que tu peut nous données des informations sur ce qui ne fonctionnent pas, est-ce que le script plante ?

Est-ce que tu as des logs d'erreurs dans ton terminal ?

D'où viennent le tableau args ? Est-ce que tu la parser depuis le contenu du message ?

De ce que je penses comprendre du morceau de code la lecture du lien dans le fichier JSON devrait être fait après avoir vérifié que que les données sont valide pour ne pas référencé un lien qui n'existerait pas.

Si le comportement actuel et que quand un lien n'existe pas le terminal te log un:

TypeError anime[args[1]] is undefined où  TypeError anime[args[1]]["s" + args[2]] is undefined le problème vient surement de là.

Un exemple qui lirais le lien après avoir vérifié que les données provenant de args qui servent à le référencé sont valide serait:

const anime = require("./anime_list.json")  
 
 if(message.content.startsWith("_anime")){
  
        if(
        	!args[1] ||
            !anime[args[1]] ||
            !args[2] ||
            !anime[args[1]]["s" + args[2]] ||
            !args[3] ||
            !anime[args[1]]["s" + args[2]]["ep" + args[3]]
        ) {
            msg(`Sois la commande est erronnée,
                sois l'anime demandé n'est pas present dans nos bases de données.
                Si vous souhaitez l'obtenir,
                contactez nous a cet adresse: https://discord.com/channels/@me/454939105411858432
            `);
        } else {
			// lit le liens uniquement sit les arguments sont valides
            // pour ne pas déclenché un `TypeError`
            const link = anime[args[1]]["s" + args[2]]["ep" + args[3]];
            
        	message.author
        	.createDM()
            .then(channel => (
            	channel.send(link)
            ))
            .catch(channel => (
            	channel.send("Une erreur est survenue")
            ));
        }
 		
        // je n'est pas bien compris si il fallait toujours supprimé le message
        // où seulement si il était valide
        // à déplacé dans le block adapté:
       	message.delete();
        // message.delete(); renvoi une promesse qui indique si la suppression à échoué ou non
        
        /*
        message.delete()
        .then(messageDelete => {
        	console.log('suppression du message réussie');
        })
        .catch(error => {
        	console.error(`la suppréssion du message: "${message.id}" à échoué avec le status: ${error.message}`);
            throw new Error('delete message has crash');
        });
        */
}



  • Partager sur Facebook
  • Partager sur Twitter

suggestion de présentation.

11 avril 2021 à 16:21:25

J'ai défini les arguments de cette façon: 

let args = message.content.trim().split(/ +/g);

Et lorsque je tape une commande valide, le lien m'est bien envoyé en message privé. Mais si je tape par exemple: _anime a a a

aucun message n'est envoyé, j'ai juste l'erreur: Cannot read property 'sa' of undefined

Je sais que 'sa' correspond à "s" + args[2], donc la saison, mais je ne comprend pas pourquoi la fonction catch ne fonctionne pas

Merci d'avance ^^ 

-
Edité par LéoJason 11 avril 2021 à 16:38:08

  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2021 à 18:28:12

La fonction catch ne se déclenche pas parce qu'elle englobe le traitement de message.author.createDM()

 message.author.createDM().then(channel => channel.send(link)).catch(channel => channel.send("Une erreur est survenue"))

Et que la ligne qui plante c'est: 

const link = anime[args[1]]["s" + args[2]]["ep" + args[3]]

Ici link reférencé par des valeur qui n'existe pas lorsque la commande et invalide lorsque tu entre une  commande du genre:

 _anime a a a

ça revient à faire:

anime["a"]["s" + "a"]["ep" + "a"]

mais comme le premier index soit: anime["a"]  vaut dejà la valeur undefined parce qu'il existe pas ben du coups ça revient à faire:

undefined["s" + "a"]["ep" + "a"] // <-- Cannot read property "sa" of undefined

en effet tu essaie de lire "sa" sur undefined c'est une erreur.



Dans le message précédent j'avais ré écrit la structure de ton code pour que le lien soit lue uniquement si les valeur de args on été validé par ta condition, si tu veut attrapé l'erreur sans changé de structure sur ton code tu peut l'encapsulé d'un block try ...catch

let link = null;
try {
	// ici essaie de référencé la donnée anime 
	link = anime[args[1]]["s" + args[2]]["ep" + args[3]];
    
    // ...

} catch(TypeError) {
	// ici une Error de type TypeError et survenue
	// la command est invalide
    
    // ...
}
 




  • Partager sur Facebook
  • Partager sur Twitter

suggestion de présentation.

14 avril 2021 à 15:39:35

SamuelGaborieau3 a écrit:

La fonction catch ne se déclenche pas parce qu'elle englobe le traitement de message.author.createDM()

 message.author.createDM().then(channel => channel.send(link)).catch(channel => channel.send("Une erreur est survenue"))

Et que la ligne qui plante c'est: 

const link = anime[args[1]]["s" + args[2]]["ep" + args[3]]

Ici link reférencé par des valeur qui n'existe pas lorsque la commande et invalide lorsque tu entre une  commande du genre:

 _anime a a a

ça revient à faire:

anime["a"]["s" + "a"]["ep" + "a"]

mais comme le premier index soit: anime["a"]  vaut dejà la valeur undefined parce qu'il existe pas ben du coups ça revient à faire:

undefined["s" + "a"]["ep" + "a"] // <-- Cannot read property "sa" of undefined

en effet tu essaie de lire "sa" sur undefined c'est une erreur.



Dans le message précédent j'avais ré écrit la structure de ton code pour que le lien soit lue uniquement si les valeur de args on été validé par ta condition, si tu veut attrapé l'erreur sans changé de structure sur ton code tu peut l'encapsulé d'un block try ...catch

let link = null;
try {
	// ici essaie de référencé la donnée anime 
	link = anime[args[1]]["s" + args[2]]["ep" + args[3]];
    
    // ...

} catch(TypeError) {
	// ici une Error de type TypeError et survenue
	// la command est invalide
    
    // ...
}
 



Cela fonctionne parfaitement. Merci beaucoup 😁

-
Edité par LéoJason 14 avril 2021 à 15:40:02

  • Partager sur Facebook
  • Partager sur Twitter