Mi programa Node.js está trabajando en una larga lista de tareas, por lo que estoy guardando el progreso como una cantidad de tareas procesadas en un archivo .JSON para realizar un seguimiento. En aproximadamente el 90 % de los casos, todo está bien, pero rara vez el programa genera un archivo .JSON vacío. Intenté buscar nulo y una cadena vacía, pero no funcionó. El error todavía no se lanza al escribir, sino en la próxima lectura. Estoy confundido acerca de escribir un archivo vacío, porque de la forma en que lo entiendo, incluso si se recibe un valor no válido para procesado_tasks_num, entonces solo un valor en el JSON debería ser incorrecto y la estructura JSON en sí sigue intacta.
Pregunta: ¿Cómo puedo evitar que mi función update_settings produzca un archivo vacío? Tanto lanzar como atrapar el error estaría bien.
Nodo v14.17.3; Sistema operativo Windows 10 Business 21H2
export async function update_settings(logs_category, logs_event, processed_tasks_num) { let path "C:\\Users\\MyUser\\MyLogsFolder\\ProgramSettings" + "-" + logs_category + ".json"; // Checks for invalid values of processed_tasks_num if (typeof processed_tasks_num === "undefined" || processed_tasks_num.length === 0) { throw new RangeError("processed_tasks_num < start_tasks_num at " + logs_category); } // readFile from JSON file at path async function read_settings(callback) { // any async callback invokes callback with response fs.readFile(path,async (err, data) => { if (err) return callback(err); return callback(null, data); }); } // JSON.parse(data), update one value, writeFile to same path return new Promise((resolve => { read_settings(function edit_settings(err, data) { // process the async result let settings_obj = JSON.parse(data); settings_obj[logs_category][logs_event].start_tasks_num = processed_tasks_num; let settings_json = JSON.stringify(settings_obj, null, 2); if (settings_json === null || settings_json === "") { return new Error("empty settings_json at update_settings(), setting_json: "+settings_json); } fs.writeFile(path, settings_json, (err) => { if (err) throw err; resolve(0); }) }); })) }La función siempre se llama con await como
await update_settings(logs_category, logs_event, processed_tasks_num);Cualquier ayuda o sugerencia para encontrar una solución es muy apreciada. Gracias.
UPDATE1: Creo que este error se produce porque la función update_settings se llama desde diferentes puntos de mi programa de manera no determinista. Entonces, teóricamente, una llamada de función podría cruzarse con otra. Hasta ahora, pensé que esto se evitaría por la forma en que funciona el ciclo de eventos de Node, porque todas las llamadas de update_settings a un archivo se realizan mediante el mismo proceso de Node. Ahora estoy cuestionando este entendimiento.