Closed ccolivares closed 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.
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
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.
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 deserialize
no admite lo que le estamos intentando proporcionar obviamente.
ReadSong()
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);
}
deserialize()
de Song
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;
}
@esegredo @amarrerod @alu0101101507 @alu0101100586
¿Puedes adjuntar el fichero que te está escribiendo el write en el disco? Con pocas canciones a ser posible.
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
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
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.
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
¿Tu definición de SchemaInterface es correcta?
Creo que no...
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.
Fijandonos en el ejemplo actualizado nos hemos percatado de que se actualizó el
Write
pero no elRead
correspondiente. Por lo tanto al seguir el ejemplo estamos teniendo problemas.Le adjuntamos un ejemplo con el tipo
Song
, en primer lugar sudeserialize
:--> Acceso al archivo song.ts
Ahora le indicaremos un ejemplo del
Read
, el principal fallo está en que eldb.get()
extrae una única interfaz, y a nuestrodeserialize
al igual que en el ejemplo que se nos proporcionó se le pasa por parámetros un vector de estas interfaces:--> Acceso al archivo read.ts
Están subidos todos los cambios actuales que hemos realizado.
@esegredo @amarrerod @alu0101101507 @alu0101100586