conversion map to json syncrhonee asynchrone??

Par Florian Lefebvre, il y a 4 ans


Javascript NodeJS

Bonjour,

je suis toujour sur mon soucis de sauvegarde pour un bot discord en nodejs

J'ai pas mal avancé, j'en suis au moment d'écrire le fichier, mais j'ai un soucis original.
Avant de faire l'enregistrement du fichier je fais une console pour voir ce qui doit partir. Les donnés sont bonnes.

Mais quand j'ouvre le fichier se ne sont pas les même données qui sont enregistré, donc fausse

//envoie d'un ping sur la console pour vérifier que le cyclique fonctionne setInterval(async function () { //si l'ouverture de la sauvegarde n'a pas encore été fait if (load_sav === false) { /* récupération de données serveur et mise jours */ let edit = false; var new_data_serv = new Map(); //ouverture du fichier de sauvegarde fs.readFile('./data/serveur.json', 'utf8', function (err, data) { if (err) { throw err; } //chargement du cache des serveurs let guilds = client.guilds.cache; //extraction des données de sauvegarde let data_serveurs = JSON.parse(data); let pass = 0; guilds.forEach( function (value, key) { //si ce serveur n'est pas dans la sauvegarde if (!(key.slice(-4) in data_serveurs)) { console.log("id: " + value['id']) console.log("id_short: " + value['id'].slice(-4)) console.log("name: " + value['name']) let to_sav = new Array(); to_sav.id = value['id']; to_sav.name = value['name']; to_sav.volume = 5 to_sav.welcome = "" to_sav.tab_1d100 = new Array(); to_sav.length_1d100 = "0" console.log(to_sav) //on envoie dans la pré-sauvegarde les nouvelle donnée new_data_serv.set(key.slice(-4), to_sav) //on active l'enregistrement du fichier edit = true; } else { } }) //si des serveurs sont absent ou incomplet, on modifie la sauvegarde if (edit === true) { edit = false; console.log("new_sav_end") console.log(new_data_serv) fs.writeFile('./data/serveur.json', JSON.stringify(new_data_serv), function (err) { if (err) return console.log(err); console.log('Mise à jours réussi'); }); } else { //console.log('Aucune mise à faire'); } }); } }, 10000);

Je devrais obtenir l'équivalent de celà, c'est que me donne la console juste avant le fswrite

Map(3) { '2045' => [ id: '813341646740652045', name: "L'atelier virtuel", volume: 5, welcome: '', tab_1d100: [], length_1d100: '0' ], '2888' => [ id: '822907049326542888', name: 'En terrain neutre', volume: 5, welcome: '', tab_1d100: [], length_1d100: '0' ], '8049' => [ id: '851105621977858049', name: 'Home LIIA', volume: 5, welcome: '', tab_1d100: [], length_1d100: '0' ] }

je souhaiterai le sauvegarder dans un fichier json

Mais j'obtiens ça

{ "813341646740652045": { "name": "Home LIIA", "id": "851105621977858049", "volume": "5", "welcome": "", "tab_1d100": {}, "length_1d100": "0" }, "822907049326542888": { "name": "Home LIIA", "id": "851105621977858049", "volume": "5", "welcome": "", "tab_1d100": {}, "length_1d100": "0" }, "851105621977858049": { "name": "Home LIIA", "id": "851105621977858049", "volume": "5", "welcome": "", "tab_1d100": {}, "length_1d100": "0" } }

on voit bien que la structure est correcte, mais ormis les clés tout le reste est incorrecte, les id et name sont pas les bon., la clé et id sont identique normalement

pourquoi les données changement à l'écriture?
quelle est mon erreur?
Quelle subtilité m'échappe?

Aidez mois SVP j'aimerai comprendre

3 réponses

Julien THOMAS, il y a 4 ans

Salut ! déjà, la methode JSON.stringify ne marche pas avec les Map, et doit normalement toujours renvoyer {}. tu peux regler ca en transformant ton mapping en object :

JSON.stringify(Object.fromEntries(new_data_serv)).

Ensuite, tu utilises tes Arrays comme des objets. Je remplacerait ce code :

let to_sav = new Array(); to_sav.id = value['id']; to_sav.name = value['name']; to_sav.volume = 5 to_sav.welcome = "" to_sav.tab_1d100 = new Array(); to_sav.length_1d100 = "0"

Par :

const to_sav = { id: value['id'], name: value['name'], volume: 5, welcome: "", tab_1d100: [], length_1d100: "0" }

Et normalement cela devrait marcher !

Florian Lefebvre, il y a 4 ans

Bonjour Thomas, et avant tous merci.
le code fonctionne parfaitement, mais j'ai du mal à comprendre quelque petite chose.

-Tu as utilisé une constante, alors qu'au vue de la portabilité que je pensais nécessaire un let aurai fait le taff de mon point de vue, mais ton code me fait mentir, qu'es ce qui m'a échappé, une constante fige sur le moule de donnée ou les données??
-ton formatage de l'objet a fait son petit effet aussi, mais alors pourquoi les 2 formatage s'affichent correctement, mais seul le tiens fonctionne et je n'ai pas de warning sur le mien.

il y a t'il un équivalent en js de

// Désactiver le rapport d'erreurs error_reporting(0);

que j'aurai activé par mégarde?

c'est frustrant de ne pas voir de message d'erreur comme "t'es gros débile c'est comme ça qu'on format un tableau...", j'aurai tous accepté.

En tous encore un grand merci

manibossofficiel, il y a 4 ans

compliquer des