2012-05-21 10 views

risposta

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

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

+1

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

+0

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

57

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.

Problemi correlati