2012-05-21 14 views

Odpowiedz

30
//change the value in the in-memory object 
content.val1 = 42; 
//Serialize as JSON and Write it to a file 
fs.writeFileSync(filename, JSON.stringify(content)); 
+6

Ogólnie rzecz biorąc, lepiej byłoby użyć zapisu asynchronicznego, ponieważ jest to główny punkt węzła. Oczywiście, bez obejrzenia otaczającego kodu trudno byłoby udzielić jednoznacznej odpowiedzi. Jest mało prawdopodobne, że naprawdę potrzebujesz synchronizacji, chyba że musisz być absolutnie pewny, że nic innego nie może się wydarzyć, dopóki napis nie zostanie ukończony. Dodatkowo, oczywiście, powinno to mieć narzędzie do sprawdzania błędów, ponieważ NIGDY nie możesz mieć pewności, że zapis pliku zakończy się pomyślnie. –

+1

asynchroniczne względem synchronizacji zależy dokładnie od tego, co robisz w jakim kontekście. Jeśli jest to usługa sieciowa, potrzebujesz asynchronizacji. W przypadku narzędzia wiersza poleceń synchronizacja jest odpowiednim paradygmatem w najprostszych przypadkach, ale po prostu szarpanie się, mówiąc "asynchronizacja jest lepsza", nie jest poprawne. Mój fragment jest oparty na fragmencie kodu OP dla kontekstu. Pytanie nie dotyczy również obsługi błędów, a jeśli zapis pliku nie powiedzie się, wyjście ze śledzenia stosu jest rozsądnym domyślnym zachowaniem, ponieważ nie można wiele zrobić, aby go odzyskać. –

+0

Ponieważ węzeł jest oparty na pętlach, asynchronizacja jest prawie zawsze lepsza, więc nie blokujesz pętli, to wcale nie jest reakcja odruchowa, po prostu standardowa praktyka dla węzła Dev. Powiedziałem już, że to zależy od wymagań i nie sądzę, że Q mówi cokolwiek o linii poleceń? Ogólnie mówiąc, jeśli jest to część większego zestawu kodów (nie wyjaśnionych przez OP), obsługa błędów jest zawsze inteligentna i najlepsza praktyka. Zrzucanie śladu stosu jest dobre dla deweloperów, ale bzdura dla wszystkich. –

57

Wykonanie tego asynchronicznie jest dość łatwe. Jest to szczególnie przydatne, jeśli chcesz zablokować wątek (prawdopodobnie).

var fs = require('fs'); 
var fileName = './file.json'; 
var file = require(fileName); 

file.key = "new value"; 

fs.writeFile(fileName, JSON.stringify(file), function (err) { 
    if (err) return console.log(err); 
    console.log(JSON.stringify(file)); 
    console.log('writing to ' + fileName); 
}); 

Najważniejsze jest to, że json jest zapisany do pliku w jednym wierszu i nie jest upiększany. ex:

{ 
    "key": "value" 
} 

będzie ...

{"key": "value"} 

Aby tego uniknąć, wystarczy dodać te dwa dodatkowe argumenty JSON.stringify

JSON.stringify(file, null, 2) 

null - reprezentuje funkcję zamiennika. (w tym przypadku nie chcemy zmienić procesu)

- reprezentuje spacje na wcięcie.

Powiązane problemy