Tengo este archivo database.json en el que quiero escribir
y originalmente se verá así
{ "users": [ { "id": "470055904063127552", "credit": 10, "cooldowns": [ ] }, { "id": "533910695495073792", "credit": 15, "cooldowns": [ ] } ] }Sin embargo, después de escribirlo, el formato de repente se asustará y se convertirá en algo como esto:
{ "users": [ { "id": "470055904063127552", "credit": 10, "cooldowns": [] }, { "id": "533910695495073792", "credit": 30, "cooldowns": [] } ] } "QUIZ": 1636251021979 } ] } ] }Aquí está mi código:
fs.readFile(database_name, "utf-8", (err, data) => { if(err) return console.log(err); obj = JSON.parse(data); const cooldowns = obj.users[obj.users.findIndex(v => v.id === user)].cooldowns; if(!cooldowns.QUIZ) { cooldowns.push({ "QUIZ": new Date().getTime() + 86400000 }) } json = JSON.stringify(obj, null, 4); console.log(json); fs.writeFile(database_name, json, "utf-8", () => {}) })Lo peculiar es que devuelve console.log
{ "users": [ { "id": "470055904063127552", "credit": 10, "cooldowns": [] }, { "id": "533910695495073792", "credit": 30, "cooldowns": [ { "QUIZ": 1636251021979 } ] } ] }que es lo que quiero.
Y algo aún más extraño es que a veces escribir en el archivo funcionará y otras veces no. ¿Algunas ideas? Gracias
PD: lo único que falla es el formato JSON; no se devuelven otros errores y todas las variables se declaran y funcionan
Básicamente, me di cuenta de que estoy escribiendo en el archivo en más de un proceso al mismo tiempo, por lo que todo se vuelve loco.
La solución es usar writeFileSync() y luego actualizar el archivo JSON sincrónicamente, evitando que se ejecuten dos procesos a la vez.
O si necesita escribir en un archivo al mismo tiempo, simplemente use una base de datos.
Maldición ahora me siento estúpido
Editar: como señaló Brad, también puede bloquear el archivo al escribir en él para que la escritura no tenga que ser sincrónica. De cualquier manera, simplemente no escriba en el mismo archivo al mismo tiempo.