Comment faire pour ne pas écraser les données précédentes dans un fichier .JSON

Node.js, Expressjs

a marqué ce sujet comme résolu.

Bonjour,

Depuis pas mal de temps j’aimerais savoir comment fonctionne un système d’authentification. Pour cela, je me suis lancé dedans et je rencontre un soucis.

Voici mon code app.js:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const fs = require('fs');

app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({ extended: false }))


app.get('/', function (req, res) {
    res.send("Bienvenue sur mon système d'authentification ! :)");
});

app.get('/inscription', function (req, res) {
    res.render('inscription');
})

app.post('/inscription', function (req, res) {
    console.log(req.body)
    res.render('inscription_succes')


fs.writeFile('data.json', JSON.stringify(req.body, false, 4), (err) => {
    if (err) throw err;
    console.log('Tout va bien !')
})
})



app.get('/login', function (req, res) {
    res.render('login');
})



app.listen(3000);
console.log('Application en marche !');

Tout fonctionne correctement, les données de l’utilisateur sont bel et bien dans le fichier .json ! Il y a un seul soucis que je n’arrive pas à résoudre après plusieurs heures de recherches.

En effet, si c’est seulement 1 utilisateur qui s’inscrit tout fonctionne correctement, les données sont inscrites dans le data.json, en revanche, si c’est par exemple deux utilisateurs qui renseignent leurs données, seules celles du deuxième seront enregistrées et celles du premier utilisateur seront écrasés. Donc, si il y a plusieurs utilisateurs, seules les données du dernier utilisateur qui a entré ses infos seront inscrites dans le data.json :/

J’aimerais savoir s’il existe une fonction pour savoir comment faire pour ajouter les données à la suites des autres.

Merci et bonne journée !

Tout simplement en éditant ton JSON plutôt qu’en écrivant les données brutes dedans.

Ou en utilisant un fichier par utilisateur.

Ou alors en utilisant une base de données plutôt que des fichiers… ;)

viki53

Je veux bien edit le JSON, mais j’ai pas trouvé de fonction pour éditer et pas écraser les données précédentes :/

Un fichier par utilisateur ok, mais ça va pas être lourd ? Et concernant la DB, c’est mon premier système d’auth, donc je veux juste voir le fonctionnement :p.

EDIT: Je viens de voir fs.open, ça à l’air intéressant je vais look un peu + :p.

+0 -0

Je veux bien edit le JSON, mais j’ai pas trouvé de fonction pour éditer et pas écraser les données précédentes :/

Awoken

Ça va se faire en 4 temps :

  1. Tu lis le contenu du fichier
  2. Tu traduis le texte pour obtenir un objet/tableau JS (Un indice : JSON.parse)
  3. Tu ajoutes tes données où tu veux
  4. Tu enregistres ton objet/tableau sous forme de chaîne dans le fichier

Pour lire le contenu du fichier, pas de soucis, j’ai simplement utilisé fs.readFile.

Ensuite, concernant la "traduction du texte", je suis pas sûr d’avoir bien compris :/ Tu es sûr qu’il faut faire un JSON.parse() et non pas un JSON.stringify() ?

JSON.stringify, comme ça tu transformes en texte un objet que tu n’as pas encore. Logique, non ?

dab Oui, et je l’ai déjà fait c’est pour ça que je demande car on m’a dit de le faire xD

Donc maintenant faut que je parse le texte json en objet, mais c’est pas logique…

Car de base j’ai l’objet, je le transforme en JSON. Ensuite, je le parse pour transformer ce JSON en objet. On revient donc à la case départ :thinking:.

Merci et désolé, je préfère comprendre correctement les choses au lieu de faire ce qu’on me dit sans comprendre :).

Quand tu ouvres ton fichier, tu as une chaîne. Il faut donc la parser pour avoir un objet.

Une fois que tu as ton objet, tu peux le traverser, écrire, etc.

Quand tu as terminé de le modifier, tu le transformes en chaîne pour le stocker dans le fichier.

Donc :

  1. fs.open
  2. JSON.parse
  3. … (tes traitements)
  4. JSON.stringify
  5. fs.write
viki53

Ok, donc voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const fs = require('fs');


app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({ extended: false }))


app.get('/', function (req, res) {
    res.send("Bienvenue sur mon système d'authentification ! :)");
});

app.get('/inscription', function (req, res) {
    res.render('inscription');
})

app.post('/inscription', function (req, res) {
    console.log(req.body)
    res.render('inscription_succes')

    fs.open('data.json', JSON.parse(req.body), (err) => {
        if (err) throw err;



        fs.writeFile('data.json', JSON.stringify(req.body, false, 4), (err) => {
            if (err) throw err;
            console.log('Tout va bien !')
        })

    })



})

app.get('/login', function (req, res) {
    res.render('login');
})



app.listen(3000);
console.log('Application en marche !');

Il y a une erreur :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
TypeError: Cannot convert object to primitive value
    at JSON.parse (<anonymous>)
    at C:\Users\didi\Desktop\Awauth\app.js:23:31
    at Layer.handle [as handle_request] (C:\Users\didi\Desktop\Awauth\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\didi\Desktop\Awauth\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\didi\Desktop\Awauth\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\didi\Desktop\Awauth\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\didi\Desktop\Awauth\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\didi\Desktop\Awauth\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\didi\Desktop\Awauth\node_modules\express\lib\router\index.js:275:10)
    at C:\Users\didi\Desktop\Awauth\node_modules\body-parser\lib\read.js:130:5

J’ai du mal utilisé le JSON.parse haha, je vais revoir la doc :).

Alors, j’ai compris comment fonctionnait le JSON.parse() désormais ! :D C’est déjà ça car j’avais pas bien tout assimiler.

Voici le code :

1
2
3
4
5
6
7
8
let contents = fs.readFileSync("data.json");
let jsonContent = JSON.parse(contents);
console.log('Username: ', jsonContent.user_pseudo);


fs.open('data.json', 'a+', (err, fd) => {

})

J’ai aussi lu la doc de fs.open, là ça devrait être bon ! Seulement, je ne sais quoi pas mettre dedans :thinking:

Merci de votre aide !

Le push est une méthode approprié si tu veux garder une structure avec un serveur HTTP. Sinon tu as les websockets : https://github.com/sockjs . Je serais plus d’avis pour les websockets qui sont censé être plus rapide.

Le push consiste à garder une requête active (en attendant avant d’envoyer le retour (HTML/JSON) de la page) car le serveur PHP ne peut pas envoyer de requête au client par sa propre initiative. Alors que le websocket tu peux envoyer des requêtes quand tu veux.

Côté navigateur : https://github.com/sockjs/sockjs-client
Côté nodejs : https://github.com/sockjs/sockjs-node

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte