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
Réponse acceptée

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 !

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

compliquer des