ULL-ESIT-INF-DSI-2122 / ull-esit-inf-dsi-21-22-prct07-music-datamodel-grupo_n

GRUPO N - José Miguel Hernández, Jonay Estévez, Carla Olivares
0 stars 0 forks source link

Problemas con el Read de Lowdb (Urgente) #2

Closed ccolivares closed 2 years ago

ccolivares commented 2 years ago

Fijandonos en el ejemplo actualizado nos hemos percatado de que se actualizó el Write pero no el Read correspondiente. Por lo tanto al seguir el ejemplo estamos teniendo problemas.

Le adjuntamos un ejemplo con el tipo Song, en primer lugar su deserialize:

public static deserialize(song: SongInterface[]): Song[] {
    let aux_array: Song[] = [];

    song.forEach((element) => {
      let aux_g: MusicGender[] = [];
      element.gender.forEach((item) => {aux_g.push(new MusicGender(item.gender))});

      if('band' in element.author) { 
        let aux_band: Artist[] = [];
        element.author.band.forEach((item) => {aux_band.push(new Artist(item.name, aux_g, item.avg))});
        let aux_author: Group = new Group(element.author.name, aux_band, aux_g, element.author.avg);
        aux_array.push(new Song(element.name, aux_author, element.duration, aux_g, element.single, element.repro));

      } else {
        let aux_author: Artist = new Artist(element.author.name, aux_g, element.author.avg);
        aux_array.push(new Song(element.name, aux_author, element.duration, aux_g, element.single, element.repro));
      }
    });

    return aux_array;
  }

--> Acceso al archivo song.ts

Ahora le indicaremos un ejemplo del Read, el principal fallo está en que el db.get() extrae una única interfaz, y a nuestro deserialize al igual que en el ejemplo que se nos proporcionó se le pasa por parámetros un vector de estas interfaces:

export function ReadSong(): Song[] {
  const db: lowdb.LowdbSync<SchemaInterface> = lowdb(new FileSync('./database/song.json'));
  const serializedSongs = db.get("song").value();

  return Song.deserialize(serializedSongs);
}

--> Acceso al archivo read.ts

Están subidos todos los cambios actuales que hemos realizado.

@esegredo @amarrerod @alu0101101507 @alu0101100586

esegredo commented 2 years ago

Hola, buenas tardes.

¿Cuándo escriben al fichero de la base de datos, en qué fichero escriben? Asegúrense que sea el fichero ./database/song.json. Al mismo tiempo, cuando escriben, ¿se han asegurado que se guardan diferentes canciones y no solo una?

En el ejemplo de Github Gist proporcionado todo funciona correctamente.

Saludos.

ccolivares commented 2 years ago

Buenas tardes,

Nuestro Write se ejecuta correctamente, podemos escribir lo que queramos y sale perfectamente, sea el objeto que sea, mas bien nuestra práctica ahora mismo esta completamente basada en el Write ya que no podemos utilizar el Read, y nuestros métodos funcionan. El problema es obviamente que no podemos leer esa información de los archivos, por lo tanto no podemos tener en si una base de datos, en su defecto llenamos los archivos JSON con datos ya declarados y se agregan sin problemas. El problema es el Read.

Aquí a continuación adjuntamos el código del mismo:

export function Write(option: string, object: Album[]|Artist[]|Group[]|MusicGender[]|Song[]|Playlist[]) {
  const ext: string = '.json';
  const path: string = './database/';
  const db: lowdb.LowdbSync<SchemaInterface> = lowdb(new FileSync(path + option + ext));
  db.set(option, object).write();
}

--> Acceso al archivo write.ts

Al parámetro option de nuestro Write se le pasa el nombre que tendrá tanto el archivo como el identificador del objeto JSON. Por ejemplo 'song' para objetos Song.

Hemos intentado todo tipo de opciones, y terminamos por crear métodos Read independientes para cada tipo de dato (como le indicamos en esta issue) porque nos quedamos sin opciones. Realmente necesitamos una mano con esto, si tiene que ser a través de una tutoría si es posible pero necesitamos solucionar este problema para poder acabar el código.

@esegredo @amarrerod @alu0101101507 @alu0101100586

esegredo commented 2 years ago

Esta noche intentaré echar un vistazo a lo que sucede pero el código del read del ejemplo que les pasé funciona correctamente.

¿Han probado ese ejemplo modificado? Asegúrense de que los ficheros donde escriben son los ficheros que están leyendo porque entonces no me explico qué puede estar sucediendo.

ccolivares commented 2 years ago

Igualmente le repito el problema principal que estamos teniendo.

Nuestro Read, en este caso concreto ReadSong, devuelve un vector de Song, pero el db.get extrae una única interfaz, y a nuestro deserialize se le pasa por parámetros un vector de estas interfaces.

Por lo tanto serializedSongs es una única interfaz y el deserialize no admite ese parámetro ya que pide un vector de interfaces, no una única interfaz. Así que el código que adjuntamos aquí no es funcional, el deserializeno admite lo que le estamos intentando proporcionar obviamente.

@esegredo @amarrerod @alu0101101507 @alu0101100586

esegredo commented 2 years ago

¿Puedes adjuntar el fichero que te está escribiendo el write en el disco? Con pocas canciones a ser posible.

alu0101101507 commented 2 years ago

Puede ver los archivos .json generados por el Write en la carpeta database del repositorio aquí.

Aún así insistimos que no es el Write el que nos da problemas, es mas bien el Read.

@esegredo @amarrerod @alu0101101507 @alu0101100586

esegredo commented 2 years ago

Hola de nuevo,

Soy consciente de que el problema lo tienen en el read, pero no sé qué les puede estar pasando.

Con un código tan sencillo como:

const db: lowdb.LowdbSync = lowdb(new FileSync("song.json")); const serializedSongs = db.get("song").value();

console.log(serializedSongs);

serializedSongs.forEach(song => { console.log(song.name); });

Soy capaz de leer todo el fichero song.json, además de imprimir los nombres de las diferentes canciones almacenadas.

alu0101100586 commented 2 years ago

Acabo de intentar el código que usted nos proporcionó en la última contestación. Y me da dos fallos, la primera que la variable serializedSong no tiene el método forEach, pues no existe en la interface SongInterface. Lo cual me hace pensar que no lo está detectando como array, y por lo tanto nos da el fallo que comentábamos al principio de la issue, pues el el método deserialize de la class Song lo que espera es una variable de tipo SongInterface[].

Por otro lado aquí le copio los errores y el código ejecutado:

export function ReadSong() {

  const db: lowdb.LowdbSync<SchemaInterface> = lowdb(new FileSync('./database/song.json'));
  const serializedSongs = db.get("song").value();

  serializedSongs.forEach(song => {
    console.log(song.name);
    });
}

Errores:

@esegredo @amarrerod @alu0101101507 @ccolivares

esegredo commented 2 years ago

¿Tu definición de SchemaInterface es correcta?

Creo que no...

alu0101100586 commented 2 years ago

Muchas gracias profesor, el problema era la definición del SchemaInterface, es que con algunos cambios que hemos hecho, se nos olvidó también modificar dicha parte del código.