Fare questo in modo asincrono è abbastanza semplice. È particolarmente utile se sei preoccupato di bloccare il thread (probabilmente).
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);
});
L'avvertenza è che JSON è scritto nel file su una riga e non è stato migliorato. es:
{
"key": "value"
}
sarà ...
{"key": "value"}
Per evitare ciò, è sufficiente aggiungere questi due argomenti in più per JSON.stringify
JSON.stringify(file, null, 2)
null
- rappresenta la funzione di sostituto. (in questo caso non vogliamo alterare il processo)
2
- rappresenta gli spazi di rientro.
Nel complesso, sarebbe preferibile utilizzare una scrittura asincrona poiché questo è l'obiettivo principale del nodo. Ovviamente, senza vedere il codice circostante, sarebbe difficile dare una risposta definitiva. È improbabile che tu abbia davvero bisogno di una sincronizzazione a meno che non sia necessario essere assolutamente sicuri che non può accadere nient'altro fino a quando la scrittura non è stata completata. Inoltre, naturalmente, questo dovrebbe avere un correttore di errori poiché non si può MAI essere sicuri che una scrittura di file avrà successo. –
async vs. sync dipende esattamente da cosa stai facendo in quale contesto. Se questo è in un servizio di rete, è necessario async. Per un'utilità da riga di comando, la sincronizzazione è il paradigma appropriato nei casi più semplici, ma solo un istante che dice "async è meglio" non è corretto. Il mio frammento si basa sullo snippet OP per il contesto. La domanda non riguarda anche la gestione degli errori e se la scrittura del file fallisce, uscire con una traccia dello stack è un comportamento di default ragionevole perché non c'è molto che puoi fare per recuperare da quello. –
Poiché il nodo è basato su loop, async è quasi sempre migliore quindi non si blocca il loop, questa non è affatto una reazione istintiva, semplicemente una pratica standard per il nodo Dev. Ho già detto che dipende dal requisito e non penso che Q dica qualcosa sulla linea di comando? Inoltre, in generale, se questo fa parte di un set di codice più ampio (non chiarito dall'OP), la gestione degli errori è sempre intelligente e consigliata. Scaricando una traccia di stack va bene per Devs ma fa schifo per tutti gli altri. –