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

Tratamento de erro angular

Boa tarde, Estou com dificuldade de realizar uma tratativa de erro no angular no seguinte cenario. Tenho uma funcionalidade que ao consumir o serviço do backend é consumido da seguinte forma

 gerarRelatorio(filtros) {
    return this.httpClient.get(super.createBaseURL() + 'solicitacoes/stream/excel' + '?' + filtros, {responseType: 'blob'});
  }

no caso de sucesso eu consigo recuperar o arquivo e realizo o download normalmente. Mas quando ocorre erro eu programei para que o meu backend retorna-se uma mensagem de erro mas não consigo obter a mensagem no front para exibi-la para o usuário. Aguém possui alguma ideia para me ajudar?

4 respostas

Fala Robson,

Coloca um catch nesse método gerarRelatorio, tipo


gerarRelatorio(filtros) {
    return this.httpClient.get(super.createBaseURL() + 'solicitacoes/stream/excel' + '?' + filtros, {responseType: 'blob'})
.catch(error=>{
// Tenta o erro, manda alerta ou passa o erro adiante
}
  }

Boa tarde,

já pensou em fazer um subscribe?

eu refiz o seu código e pra pegar o erro ficaria assim:

 gerarRelatorio(filtros) {
    return this.httpClient.get(`${super.createBaseURL()}solicitacoes/stream/excel?filtros`, {responseType: 'blob'}).subscribe(res => console.log(res), err => console.log(err));
  }

Você pode substituir o meu console.log pelo que você quiser fazer com a resposta.

Leomarques, ai que está eu utilizo o subscribe porém pelo fato de ter o (codigo abaixo) me impede de recuperar a mensagem do objeto err pois ela viria como JSON e tentei pelo header e também não tive sucesso mesmo com a mensagem e o header sendo printados na aba NetWork do browser (utilizo o chrome). Digo isso pois eu dava o inspect no objeto err ao depurar o JS no chrome a chave que informava no back-end para recuperar a mensagem não aparecia para poder recuperar.

{responseType: 'blob'}
solução!

Esse é um antigo problema do Angular, você vai ter que utilizar um FileReader pra pegar o erro, pra resolver isso, eu implementei 1 método:

Você pode usar esse método para analisar o erro:

  parseErrorBlob(err: HttpErrorResponse): Observable<any> { 
    const reader: FileReader = new FileReader(); 
    const obs = Observable.create((observer: any) => { 
      reader.onloadend = (e) => { 
        observer.error(JSON.parse(reader.result)); 
        observer.complete(); 
      } 
    }); 

    reader.readAsText(err.error); 
    return obs; 
  }

e usá-lo assim:

  gerarRelatorio(filtros) {
    return this.httpClient.get(`${super.createBaseURL()}solicitacoes/stream/excel?filtros`, {responseType: 'blob'}).pipe(catchError(this.parseErrorBlob));
  }

Fazendo uso do operador catchError do rxjs.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software