Estoy haciendo un juego y estoy trabajando en las cuentas. Cuando tengo JSON para clasificar el objeto y guardarlo en un archivo, a veces (ocasionalmente y al azar) escribe:
{"example@domain.cm":{"email":"example@domain.cm","password":"myPassword","token":"c26a2a66-77f8-43d7-aa92-14da81979386"} >}< "example@domain.com":{"email":"example@domain.com","password":"myPassword","token":"209758d0-9a6e-4e99-835a-21595b822796"}}cuando estoy esperando:
{"example@domain.cm":{"email":"example@domain.cm","password":"myPassword","token":"c26a2a66-77f8-43d7-aa92-14da81979386"} >,< "example@domain.com":{"email":"example@domain.com","password":"myPassword","token":"209758d0-9a6e-4e99-835a-21595b822796"}}Mi código:
const fs = require('fs'); const { v4: newUuid } = require('uuid'); function save() { fs.writeFile('save_info/users.json', JSON.stringify(User.USERS), err => {}); } class User { static USERS = {}; constructor(email, password, token = newUuid()) { this.email = email; this.password = password; this.token = token; User.USERS[email] = this; save(); } }¿Qué está pasando?
EDITAR Estoy usando nodemon. Cada vez que guardo un archivo (excepto users.json), lo detiene y lo inicia automáticamente. También estoy usando express porque este script es para la parte del servidor. (Este es un proyecto privado, no busca hacerlo perfecto, solo aprenda)
Gracias, @jabaa, han señalado una advertencia de que usar fs.writeFile() varias veces sin esperar la devolución de llamada no es seguro. Aquí está la solución:
var CAN_SAVE = true; var PENDING_SAVE = false; function save() { if (!CAN_SAVE) { PENDING_SAVE = true; return; } PENDING_SAVE = false; CAN_SAVE = false; fs.writeFile('save_info/users.json', JSON.stringify(User.USERS), err => { CAN_SAVE = true; if (PENDING_SAVE) save(); }); } Otra solución es usar fs.writeFileSync() , que en realidad podría ser mejor en mi caso... (Gracias, @Steven Spungin)