Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Erro 500 no upload

photo-form.component.ts

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { PhotoService } from '../photo/photo.service';
import { Router } from '@angular/router';

@Component({
  selector: 'ap-photo-form',
  templateUrl: './photo-form.component.html',
  styleUrls: ['./photo-form.component.css']
})
export class PhotoFormComponent implements OnInit {

  photoForm: FormGroup;
  file: File;

  constructor(
    private formBuilder: FormBuilder,
    private photoService: PhotoService,
    private router: Router
  ) { }

  ngOnInit() {
    this.photoForm = this.formBuilder.group({
      file: ['', Validators.required],
      description: ['', Validators.maxLength(300)],
      allowComments: [true]
    })
  }

  upload(){
    const description = this.photoForm.get('description').value;
    const allowComments = this.photoForm.get('allowComments').value;
    console.log(this.file);
    this.photoService
      .upload(description, allowComments, this.file)
      .subscribe(() => this.router.navigate(['']))
  }
}

photo.service.ts


    upload(description: string, allowComments: boolean, file: File){
        // I'm not sending a JSON, must send FormData
        const formData = new FormData();
        formData.append('description', description);
        formData.append('allowComments', allowComments ? 'true' : 'false');
        formData.append('imageFile', file);
        return this.http.post(API + '/photos/upload', formData);
    }

this.file & erro:

File {name: "HCP_Logo_New_PsychK-197x300.jpg", lastModified: 1574785757925, lastModifiedDate: Tue Nov 26 2019 13:29:17 GMT-0300 (Horário Padrão de Brasília), webkitRelativePath: "", size: 35243, …}
name: "HCP_Logo_New_PsychK-197x300.jpg"
lastModified: 1574785757925
lastModifiedDate: Tue Nov 26 2019 13:29:17 GMT-0300 (Horário Padrão de Brasília) {}
webkitRelativePath: ""
size: 35243
type: "image/jpeg"
__proto__: File
POST http://localhost:3000/photos/upload 500 (Internal Server Error)
ERROR HttpErrorResponse {headers: HttpHeaders, status: 500, statusText: "Internal Server Error", url: "http://localhost:3000/photos/upload", ok: false, …}
7 respostas

O estranho é que as fotos estão na pasta da api, mas o erro 500 persiste...

Segue o link do meu repositório no github: https://github.com/william-takayama/alurapic

Boa tarde, William! Como vai?

Essa mensagem de erro que vc disponibilizou está completa? Caso não esteja, vc poderia postar a mensagem completa aqui, por favor?

Obrigado pelo retorno, Gabriel! Vou mandar o log da msg de erro completa:

POST http://localhost:3000/photos/upload 500 (Internal Server Error)
scheduleTask @ polyfills.js:5605
push../node_modules/zone.js/dist/zone.js.ZoneDelegate.scheduleTask @ polyfills.js:2772
onScheduleTask @ polyfills.js:2663
push../node_modules/zone.js/dist/zone.js.ZoneDelegate.scheduleTask @ polyfills.js:2766
push../node_modules/zone.js/dist/zone.js.Zone.scheduleTask @ polyfills.js:2600
push../node_modules/zone.js/dist/zone.js.Zone.scheduleMacroTask @ polyfills.js:2623
scheduleMacroTaskWithCurrentZone @ polyfills.js:3607
(anonymous) @ polyfills.js:5638
proto.<computed> @ polyfills.js:3931
(anonymous) @ vendor.js:7573
push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe @ vendor.js:68746
push../node_modules/rxjs/_esm5/internal/operators/tap.js.DoOperator.call @ vendor.js:81722
push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe @ vendor.js:68743
(anonymous) @ vendor.js:85210
subscribeToResult @ vendor.js:85393
push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._innerSub @ vendor.js:78212
push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._tryNext @ vendor.js:78209
push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._next @ vendor.js:78192
push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next @ vendor.js:69536
(anonymous) @ vendor.js:72954
push../node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe @ vendor.js:68761
push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe @ vendor.js:68746
push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapOperator.call @ vendor.js:78165
push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe @ vendor.js:68743
push../node_modules/rxjs/_esm5/internal/operators/finalize.js.FinallyOperator.call @ vendor.js:76910
push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe @ vendor.js:68743
push../src/app/photos/photo-form/photo-form.component.ts.PhotoFormComponent.upload @ main.js:1251
eval @ PhotoFormComponent.ngfactory.js:163
handleEvent @ vendor.js:43356
callWithDebugContext @ vendor.js:44449
debugHandleEvent @ vendor.js:44152
dispatchEvent @ vendor.js:40815
(anonymous) @ vendor.js:41259
(anonymous) @ vendor.js:59151
push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask @ polyfills.js:2785
onInvokeTask @ vendor.js:36916
push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask @ polyfills.js:2784
push../node_modules/zone.js/dist/zone.js.Zone.runTask @ polyfills.js:2557
push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask @ polyfills.js:2860
invokeTask @ polyfills.js:4106
globalZoneAwareCallback @ polyfills.js:4132
Show 11 more frames
main.js:1259 
HttpErrorResponse {headers: HttpHeaders, status: 500, statusText: "Internal Server Error", url: "http://localhost:3000/photos/upload", ok: false, …}
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
status: 500
statusText: "Internal Server Error"
url: "http://localhost:3000/photos/upload"
ok: false
name: "HttpErrorResponse"
message: "Http failure response for http://localhost:3000/photos/upload: 500 Internal Server Error"
error: {message: "Internal server error"}
__proto__: HttpResponseBase
constructor: ƒ HttpErrorResponse(init)
__proto__: Object

Fala ai William, tudo bem? Por estar ocorrendo esse erro 500 no servidor fica um pouco mais complicado saber o erro exato e te ajudar.

Isso porque erros 500 são erros não tratados pelo servidor.

No caso, talvez os dados da requisição estejam chegando para o back de uma maneira ou formato que ele não espera e sendo assim ele lança exceções que estão sem tratamento.

Uma dica seria você abrir o console do navegador ir até a aba de requisições (no caso do Chrome a Network), limpar todos os log's anteriores e tentar fazer o upload.

Provavelmente vai aparecer uma linha em vermelha onde você pode verificar os dados da requisição (Header, URL, Verbo, Body, etc...).

Tente ver como está sendo enviado o body, se ele contém os dados da imagem.

Se quiser, compartilha o projeto, assim a gente consegue simular localmente e analisar o problema com mais calma.

Isso porque podemos estar deixando passar algum pequeno detalhe olhando os códigos.

Espero ter ajudado.

Bom dia, Matheus! Obrigado pelo retorno. (Obs: estou usando a api-windows disponibilizada pelo instrutor Flávio)

Eu deixei o projeto no GitHub: https://github.com/william-takayama/alurapic

Tinha feito esse teste que você comentou e aparece essa linha em vermelho que você citou. A msg de erro que aparece é a seguinte:

Request URL: http://localhost:3000/photos/upload
Request Method: POST
Status Code: 500 Internal Server Error
Remote Address: [::1]:3000
Referrer Policy: no-referrer-when-downgrade
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: x-access-token
Connection: keep-alive
Content-Length: 35
Content-Type: application/json; charset=utf-8
Date: Tue, 14 Apr 2020 12:34:07 GMT
ETag: W/"23-8NdEwgOr82p+EmFyYngVj/j+ywQ"
X-Powered-By: Express
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,ja-JP;q=0.6,ja;q=0.5
Connection: keep-alive
Content-Length: 129573
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryVncl4en8g0yjAh6M
Host: localhost:3000
Origin: http://localhost:4200
Referer: http://localhost:4200/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36
x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6ImZsYXZpbyIsImVtYWlsIjoiZmxhdmlvQGFsdXJhcGljLmNvbS5iciIsImlhdCI6MTU4Njg2NzYyMCwiZXhwIjoxNTg2OTU0MDIwfQ.0V4wCrDzaawq3q9Potu38gPOwwhikyPEPcH9khVHD08

**FORMDATA**
------WebKitFormBoundaryVncl4en8g0yjAh6M
Content-Disposition: form-data; name="description"
Grasshopper

------WebKitFormBoundaryVncl4en8g0yjAh6M
Content-Disposition: form-data; name="allowComments"
false

------WebKitFormBoundaryVncl4en8g0yjAh6M
Content-Disposition: form-data; name="imageFile"; filename="GrassHoper - JavaScript - Animations 2.png"
Content-Type: image/png

------WebKitFormBoundaryVncl4en8g0yjAh6M--

Já logo acima da linha que está vermelha, aparece um arquivo (não vermelho), com nome: "data:image/png;base64" seguido de um binário, que imagino ser a imagem. Por isso, acredito que o arquivo esteja sendo enviado, pois aparece na linha de comando do prompt que está rodando o server, que a imagem teve o upload bem sucedido:

A token is send by the application
Token value is eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6ImZsYXZpbyIsImVtYWlsIjoiZmxhdmlvQGFsdXJhcGljLmNvbS5iciIsImlhdCI6MTU4Njg2NzYyMCwiZXhwIjoxNTg2OTU0MDIwfQ.0V4wCrDzaawq3q9Potu38gPOwwhikyPEPcH9khVHD08
####################################
Valid token received: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6ImZsYXZpbyIsImVtYWlsIjoiZmxhdmlvQGFsdXJhcGljLmNvbS5iciIsImlhdCI6MTU4Njg2NzYyMCwiZXhwIjoxNTg2OTU0MDIwfQ.0V4wCrDzaawq3q9Potu38gPOwwhikyPEPcH9khVHD08
Receiving image file
upload complete
Photo data [Object: null prototype] {
  description: 'Grasshopper',
  allowComments: 'false'
}
File info {
  fieldname: 'imageFile',
  originalname: 'GrassHoper - JavaScript - Animations 2.png',
  encoding: '7bit',
  mimetype: 'image/png',
  destination: 'uploads/imgs',
  filename: '2a44a637-4a9b-4ada-b9f9-e3bb124d71ab.png',
  path: 'uploads\\imgs\\2a44a637-4a9b-4ada-b9f9-e3bb124d71ab.png',
  size: 129139
}
TypeError: image.exifRotate is not a function
    at api.addUpload (C:\Users\William\Desktop\Cursos\Alura\Angular\api-windows\app\api\photo.js:47:14)

O path da imagem achei estranho conter duas barras e também dá o erro de: TypeError: image.exifRotate is not a function at api.addUpload (C:\Users\William\Desktop\Cursos\Alura\Angular\api-windows\app\api\photo.js:47:14)

solução!

Opa, consegui resolver!

Baixei para testar a API (sem ser a api-windows), no link: https://cursos.alura.com.br/course/angular-fundamentos/task/38530 Tentei executar o passo-a-passo, mas estava dando erro na aplicação para subir o servidor. Então rodei o comando:

npm install sqlite3 
npm start

Após rodar os comandos, a api voltou a funcionar e consegui realizar o upload da foto! Acredito que tenha sido algum problema na api-windows

Fala William, fico feliz que tenha resolvido seu problema.

Realmente eu testei o código com seu projeto aqui e funcionou certinho.

Abraços e bons estudos.