para un proyecto escolar, tengo que reescribir un objeto Json usando el nodo fs. Escribí un módulo y si uso deleteCity o addCity solos, funcionan perfectamente bien. Pero cuando llamo a ambos después de otro , solo uno funciona . En mi archivo JSON hay una matriz con 10 objetos. En mi archivo javascript principal, necesito mi módulo y llamo a las funciones addCity y deleteCity.
//Modules const fs = require("fs"); //Variablen const citiesPath = "./cities.json"; //Funktionen const deleteCity = (name) => { fs.readFile(citiesPath, "utf-8", (err, jstring) => { if (err) { console.log(err); } try { let data = JSON.parse(jstring); for (let i = 0; i < data.length; i++) { if (data[i].Name == name) { data.splice(i, 1); } } fs.writeFile(citiesPath, JSON.stringify(data, null, 2), (err) => { if (err) { console.log(err); } }); } catch (error) { console.log(error); } }); }; const addCity = (obj) => { fs.readFile(citiesPath, "utf-8", (err, jstring) => { if (err) { console.log(err); } try { let data = JSON.parse(jstring); data.push(obj); fs.writeFile(citiesPath, JSON.stringify(data, null, 2), (err) => { if (err) { console.log(err); } }); } catch (error) { console.log(error); } }); }; const showCity = () => { fs.readFile(citiesPath, "utf-8", (err, jstring) => { if (err) { console.log(err); } try { let data = JSON.parse(jstring); console.log(data); } catch (error) { console.log(error); } }); }; //Exporte module.exports = { deleteCity, addCity, showCity };Supongo que está llamando a ambas funciones de forma síncrona, es decir
deleteCity("London"); addCity({ "Name": "Paris" });El problema aquí es que las llamadas son asincrónicas y la segunda comenzará antes de que finalice la primera llamada, por lo que básicamente antes de que se elimine una ciudad.
Si se trata de un proyecto escolar, la solución más sencilla para corregir el código es usar la versión síncrona de las llamadas fsfs.readFileSync yfs.writeFileSync :
//Modules const fs = require("fs"); //Variablen const citiesPath = "./cities.json"; //Funktionen const deleteCity = (name) => { const jstring = fs.readFileSync(citiesPath, "utf-8"); let data = JSON.parse(jstring); for (let i = 0; i < data.length; i++) { if (data[i].Name == name) { data.splice(i, 1); } } fs.writeFileSync(citiesPath, JSON.stringify(data, null, 2)); }; const addCity = (obj) => { const jstring = fs.readFileSync(citiesPath, "utf-8"); let data = JSON.parse(jstring); data.push(obj); fs.writeFileSync(citiesPath, JSON.stringify(data, null, 2)); }; const showCity = () => { const jstring = fs.readFileSync(citiesPath, "utf-8"); let data = JSON.parse(jstring); console.log(data); }; //Exporte module.exports = { deleteCity, addCity, showCity };Tenga en cuenta que no necesita detectar los errores solo para registrarlos dentro de sus funciones sincrónicas. Si se lanza un error y no se detecta, Node.js lo registrará por usted.