2

En seguimiento a mi post anterior he podido establecer en qué parte se produce el error al subir dos o más archivos, lo comparto para aportar más antecedente que faciliten la ayuda que me puedan prestar. Gracias por su atención y tiempo. A continuación describo la situación:

1.-Base MongoDb: sin documentos 2. Carpeta upload: Vacía

En la app: (subida de un solo archivo)

1.- Al seleccionar el archivo a cargar:

a) Se produce el evento “fileChangeEvent” y le paso la variable “$event” que tendrá todos los datos que capture (en este caso el archivo seleccionado”)

fileChangeEvent(fileinput:any){
    console.log(' My fileinput entrega:  ' );
    console.log( fileinput );
    this.filesToUpload = fileinput.target.files as Array<File>;
  }

En la consola puedo ver:

1.  Event {isTrusted: true, type: "change", target: input, currentTarget: input, eventPhase: 2, …}
1.  isTrusted: true
2.  type: "change"
3.  target: input
1.  accept: ""
2.  alt: ""
3.  autocomplete: ""
4.  defaultChecked: false
5.  checked: false
6.  dirName: ""
7.  disabled: false
8.  form: form.ng-dirty.ng-touched.ng-valid
9.  **files: FileList**
1.  **length: 1**
2.  **0: File {name: "Playa.jpg", lastModified: 1576198518688, lastModifiedDate: Thu Dec 12 2019 21:55:18 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 25559, …}**
3.  __proto__: FileList
10. formAction: "http://localhost:4200/crear-proyecto"

Si le doy al Submit “Enviar” se ejecuta el código:

onSubmit(form){

    *console.log('Esto se va en el project')*
    *console.log(this.project);*
    // Guardar datos básicos
    this._projectService.saveProject(this.project).subscribe(

        response => {
          if(response.project){

              // Subir la imagen... solo cuando la deba subir!
              if(this.filesToUpload){
                *console.log( "El filesToUpload, en mi 'create.component.ts' tiene:  " );*
                *console.log( this.filesToUpload);*

                this._uploadService.makeFileRequest(Global.url + 'upload-image/' + response.project._id, [], this.filesToUpload, 'image').
                        then((result:any) => {
                  this.save_project = result.project;
                  this.status = 'success';
                  console.log('El result me entrega:   ');
                  console.log(result);

                  // Con esto vacío el formulario una vez que ya se ha guardado
                  form.reset();
                });

              }else{
                this.save_project = response.project;
                this.status = 'success';
                form.reset();

              }

            }else{
              this.status = 'failed';
            }
        },
        error => {
          console.log(<any>error); 
        }

    );
  }

** Y en la consola puedo ver:**

Esto se va en el project
1.  Project {_id: "", name: "er", description: "er", category: "er", year: 2019, …}
El filesToUpload, en mi 'create.component.ts' tiene: 
1.  FileList {0: File, length: 1}
El result me entrega: 
1.  {project: {…}}
1.  project: {image: Array(1), _id: "5e5a851136dc6835e02bc536", name: "er", description: "er", category: "er", …}
2.  __proto__: Object

Y todo ha funcionado bien! (subiendo un solo archivo):

Base MongoDb: Tiene un nuevo documento:

{
    "_id" : ObjectId("5e5a851136dc6835e02bc536"),
    "image" : [ 
        "LFjKzVMVqRrDXImUBXeCztw5.jpg"
    ],
    "name" : "er",
    "description" : "er",
    "category" : "er",
    "year" : 2019,
    "langs" : "er",
    "__v" : 0
}

Carpeta upload: Tiene el archivo que se ha subido!!

¿Pero qué sucede al subir dos o más archivos?

1.- Al seleccionar los archivos a cargar:

a) Se produce el evento “fileChangeEvent” y le paso la variable “$event” que tendrá todos los datos que capture (en este caso el archivo seleccionado”)

En la consola puedo ver :

1.  Event {isTrusted: true, type: "change", target: input, currentTarget: input, eventPhase: 2, …}
1.  isTrusted: true
2.  type: "change"
3.  target: input
1.  accept: ""
2.  alt: ""
3.  autocomplete: ""
4.  defaultChecked: false
5.  checked: false
6.  dirName: ""
7.  disabled: false
8.  form: form.ng-dirty.ng-touched.ng-valid
9.  files: FileList
1.  length: 4
2.  0: File {name: "Ardilla.jpg", lastModified: 1576198194770, lastModifiedDate: Thu Dec 12 2019 21:49:54 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 9233, …}
3.  1: File {name: "conejo.jpg", lastModified: 1576198212660, lastModifiedDate: Thu Dec 12 2019 21:50:12 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 8521, …}
4.  2: File {name: "elefantes.jpg", lastModified: 1576198231018, lastModifiedDate: Thu Dec 12 2019 21:50:31 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 6930, …}
5.  3: File {name: "FotoParaMi.jpg", lastModified: 1573171030188, lastModifiedDate: Thu Nov 07 2019 20:57:10 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 63185, …}
6.  __proto__: FileList
10. formAction: http://localhost:4200/crear-proyecto

2. Si le doy al Submit “Enviar” se ejecuta el código que compartí más arriba, en el caso de subida de un solo archivo

En la consola puedo ver:

Esto se va en el project
1.  Project {_id: "", name: "tr", description: "tr", category: "tr", year: 2019, …}
1.  FileList {0: File, 1: File, 2: File, 3: File, length: 4}
1.  length: 4
2.  0: File {name: "Ardilla.jpg", lastModified: 1576198194770, lastModifiedDate: Thu Dec 12 2019 21:49:54 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 9233, …}
3.  1: File {name: "conejo.jpg", lastModified: 1576198212660, lastModifiedDate: Thu Dec 12 2019 21:50:12 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 8521, …}
4.  2: File {name: "elefantes.jpg", lastModified: 1576198231018, lastModifiedDate: Thu Dec 12 2019 21:50:31 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 6930, …}
5.  3: File {name: "FotoParaMi.jpg", lastModified: 1573171030188, lastModifiedDate: Thu Nov 07 2019 20:57:10 GMT-0300 (hora de verano de Chile), webkitRelativePath: "", size: 63185, …}
6.  __proto__: FileList

Hasta aquí, todo bien… el problema se produce a partir de esta línea de código en mi "create.component.ts"

                this._uploadService.makeFileRequest(Global.url + 'upload-image/' + response.project._id, [], this.filesToUpload, 'image').
                        then((result:any) => {
                  this.save_project = result.project;
                  this.status = 'success';
                  console.log('El result me entrega:   ');
                  console.log(result);

                  // Con esto vacío el formulario una vez que ya se ha guardado
                  form.reset();
                });

              }else{
                this.save_project = response.project;
                this.status = 'success';
                form.reset();

              }

            }else{
              this.status = 'failed';
            }
        },
        error => {
          console.log(<any>error); 
        }

    );
  }

Base MongoDb: Tiene un nuevo documento, pero “image”, ahora, es “null”:

{
    "_id" : ObjectId("5e5a8c6c36dc6835e02bc537"),
    "image" : null,
    "name" : "tr",
    "description" : "tr",
    "category" : "tr",
    "year" : 2019,
    "langs" : "tr",
    "__v" : 0
}

Carpeta upload: Tiene el archivo cargado en la subida de un solo archivo, más los cuatro archivos que seleccioné en la subida de dos archivos o más

Sebastián
  • 73
  • 9
  • Investigue acerca de algo llamado JEST quizás le sirva de algo. https://jestjs.io – Richard Víquez Pérez Feb 29 '20 at 17:10
  • Olvidé texto de errores en la consola: – Sebastián Feb 29 '20 at 17:12
  • POST http://localhost:3700/api/upload-image/5e5a8c6c36dc6835e02bc537 500 (Internal Server Error) – Sebastián Feb 29 '20 at 17:12
  • ERROR Error: Uncaught (in promise): TypeError: Cannot read property ; of undefined ;at uploadImage (C:\curso-javascript\backend\controllers\project.js:125:48) ; at Layer.handle [as handle_request] (C:\curso-javascript\backend\node_modules\express\lib\router\layer.js:95:5) ;at next (C:\curso-javascript\backend\node_modules\express\lib\router\route.js:137:13)
    ;at Form.<anonymous> (C:\curso-javascript\backend\node_modules\connect-multiparty\index.js:114:7) ;at Form.emit (events.js:210:5);at C:\curso-javascript\backend\node_modules\multiparty\index.js:579:12
    – Sebastián Feb 29 '20 at 17:19
  • ¡¡ Que es esto !! Una pregunta detallada, que muestra los avances, la investigación, el error concreto ... +1 ... y porque no puedo darte mas, es la primera que veo así **en meses**. He recuperado un poquito mi fe en la humanidad :-O – Trauma Feb 29 '20 at 18:15

0 Answers0