Hacer esto de forma asincrónica es bastante fácil. Es particularmente útil si le preocupa bloquear el hilo (probablemente).
const fs = require('fs');
const fileName = './file.json';
const file = require(fileName);
file.key = "new value";
fs.writeFile(fileName, JSON.stringify(file), function writeJSON(err) {
if (err) return console.log(err);
console.log(JSON.stringify(file));
console.log('writing to ' + fileName);
});
La advertencia es que json se escribe en el archivo en una línea y no se embellece. ex:
{
"key": "value"
}
estarán...
{"key": "value"}
Para evitar esto, simplemente agregue estos dos argumentos adicionales a JSON.stringify
JSON.stringify(file, null, 2)
null
- representa la función de reemplazo. (en este caso no queremos alterar el proceso)
2
- representa los espacios a sangrar.
Además de la respuesta anterior, agregue el directorio de ruta de archivo para la operación de escritura
fs.writeFile(path.join(__dirname,jsonPath), JSON.stringify(newFileData), function (err) {}
fuente
// read file and make object let content = JSON.parse(fs.readFileSync('file.json', 'utf8')); // edit or add property content.expiry_date = 999999999999; //write file fs.writeFileSync('file.json', JSON.stringify(content));
fuente
Para aquellos que buscan agregar un elemento a una colección json
function save(item, path = './collection.json'){ if (!fs.existsSync(path)) { fs.writeFile(path, JSON.stringify([item])); } else { var data = fs.readFileSync(path, 'utf8'); var list = (data.length) ? JSON.parse(data): []; if (list instanceof Array) list.push(item) else list = [item] fs.writeFileSync(path, JSON.stringify(list)); } }
fuente
Recomendaría encarecidamente no utilizar funciones síncronas (de bloqueo), ya que tienen otras operaciones simultáneas . En su lugar, use fs.promises asincrónicos :
const fs = require('fs').promises const setValue = (fn, value) => fs.readFile(fn) .then(body => JSON.parse(body)) .then(json => { // manipulate your data here json.value = value return json }) .then(json => JSON.stringify(json)) .then(body => fs.writeFile(fn, body)) .catch(error => console.warn(error))
Recuerde que
setValue
devuelve una promesa pendiente, deberá usar la función .then o, dentro de las funciones asíncronas, el operador await .// await operator await setValue('temp.json', 1) // save "value": 1 await setValue('temp.json', 2) // then "value": 2 await setValue('temp.json', 3) // then "value": 3 // then-sequence setValue('temp.json', 1) // save "value": 1 .then(() => setValue('temp.json', 2)) // then save "value": 2 .then(() => setValue('temp.json', 3)) // then save "value": 3
fuente
Guardar datos después de completar la tarea
fs.readFile("./sample.json", 'utf8', function readFileCallback(err, data) { if (err) { console.log(err); } else { fs.writeFile("./sample.json", JSON.stringify(result), 'utf8', err => { if (err) throw err; console.log('File has been saved!'); }); } });
fuente