Zapis do pliku json na serwerze

Zapis do pliku json na serwerze
NE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 41
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.

Kopiuj
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.

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

Jak to naprawić?

Xarviel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 847
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ść.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
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.

Kopiuj
{"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
Maciej Cąderek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1264
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.

NE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 41
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ć.

Kopiuj
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.");
        });
    })

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

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

Kopiuj
JSON.stringify(json, null, 2)
Maciej Cąderek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1264
0

To masz problem:

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

Chyba chodzi ci po prostu o to:

Kopiuj
json.push({ user: post });
NE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 41
0

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

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

Jak to sformatowac?

Maciej Cąderek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1264
0

Zamień:

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

na:

Kopiuj
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.

NE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 41
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.