Zapis do pliku json na serwerze

0

Witam

Próbuję zapisać obiekt do pliku json funkcją append bo potrzebuję aby jedno pod drugim zapisywało. Funkcja writeFile nadpisuj mi i nie ma reszty.

app.post('/save', function (req, res) {

    const jsonData = JSON.stringify(req.body, null, 2);

    fs.appendFile('data.json', jsonData, (err) => {
        if (err) {
            throw err;
        }
        console.log("JSON data is saved.");
    });

});

ale zapisuje mi niepoprawny format tzn bez pary kwadratowych nawiasów i bez przecinków.

{"id":1,"name":"John Snow","age":23}
{"id":2,"name":"John Snow","age":2}
{"id":3,"name":"John Snow","age":2}

Jak to naprawić?

1

Tutaj masz link jak to zrobić https://stackoverflow.com/a/36093068

Chodzi mi o ten dolny przykład z wykorzystaniem fs.readFile i fs.writeFile.

Czyli najpierw trzeba pobrać poprzednią zawartość pliku, później przeparsować to na obiekt, zmodyfikować go i na sam koniec z powrotem zapisać kasując tą wcześniejszą zawartość.

0
nefren napisał(a):

Witam

Próbuję zapisać obiekt do pliku json funkcją append bo potrzebuję aby jedno pod drugim zapisywało. Funkcja writeFile nadpisuj mi i nie ma reszty.
[...]
ale zapisuje mi niepoprawny format tzn bez pary kwadratowych nawiasów i bez przecinków.

{"id":1,"name":"John Snow","age":23}
{"id":2,"name":"John Snow","age":2}
{"id":3,"name":"John Snow","age":2}

Jak to naprawić?

To przez format którego użyłeś.

Są dwa wyjścia:

  • Dopisać wartość na koniec pliku (to jest to co robisz), używając formatu który pozwala na amendowanie
  • Odczytać plik, dodać wartość, i zapisać, używając formatu który nie pozwala na amendowanie (jak JSON, którego Ty używasz).

Możesz:

  • Albo zmienić format, który pozwala na amendowanie (jak INI, Yaml, etc.)
  • Albo odczytać zawartość przed zapisaniem, jeśli chcesz kontynuować w JSON.

Jeśli wybierzesz format JSON, to musisz:

  • Odczytać array z pliku
  • Dodać do niego otrzymany body
  • Zapisać JSON'a z powrotem
0

Możesz po prostu używać tego formatu co masz - jest to ndjson - łatwy w ręcznym parsowaniu, ale masz też libki do niego, np: https://www.npmjs.com/package/ndjson

Jeśli danych ma być dużo, to jest to lepsze rozwiązanie niż odczytywanie i edytowanie całego pliku jako zwykły JSON.

0

@Maciej Cąderek: Dla zabawy, nie będzie dużo rekordów.
@TomRiddle Miałeś rację, przez odczyt i zapis działa lecz teraz nie mogę tego poprawnie sformatować.

app.post('/save', function (req, res) {
    const post = JSON.stringify(req.body);
    fs.readFile('data.json', function (err, data) {
        const json = JSON.parse(data);
        json.push('user: ' + post);
        const newData = JSON.stringify(json, null, 2);
        fs.writeFile("data.json", newData, (err) => {
            if (err) {
                throw err;
            }
            console.log("JSON data is saved.");
        });
    })

});
["user: {\"name\":\"John\",\"email\":\"Wick\"}","user: {\"name\":\"Adrew\",\"email\":\"Lars\"}","user: {\"name\":\"Adrew\",\"email\":\"Lars\"}"]

Wiem, że to powinno zadziałąć ale nie idzie:

JSON.stringify(json, null, 2)
0

To masz problem:

json.push('user: ' + post);

Chyba chodzi ci po prostu o to:

json.push({ user: post });
0

@Maciej Cąderek: Jest lepiej ale nie do końca:

[
  {
    "user": "{\"name\":\"Adrew\",\"email\":\"Lars\"}"
  },
  {
    "user": "{\"name\":\"ff\",\"email\":\"ff\"}"
  },
  {
    "user": "{\"name\":\"ff\",\"email\":\"ff\"}"
  },
  {
    "user": "{\"name\":\"sd\",\"email\":\"sd\"}"
  }
]

Jak to sformatowac?

0

Zamień:

const post = JSON.stringify(req.body);

na:

const post = req.body

Musisz zwracać uwagę kiedy coś ma być obiektem, a kiedy stringiem.

Ogólnie zwykle chcesz operować na obiektach i dopiero na koniec zamienić całość na stringa za pomocą JSON.stringify.

0

Nie będę mówił ile nad tym siedziałem. Działa dzięki. Faktycznie pogubiłem się z tym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1