如何从Angular 4/2中的后端读取自定义错误消息

时间:2017-09-20 14:15:36

标签: angular angular4-httpclient

API

add(data) {
 return this.httpClient.post<any>('/api/v3/templates', data);
}

Observable

this.templateService.add(obj)

.subscribe(
 (response) => { 
  console.log(reposne)
 },
(error) => {
 console.log(error)
 }
);

My Post API回复了一些错误,其中一些消息作为响应,因为名称已经存在但是我无法得到错误的对象打印到控制台

The object which is printed is
{
    error:null
    headers:HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, 
    lazyInit: ƒ}
    message:"Http failure response for http://localhost/api/v3/templates: 
400 Bad Request"
    name:"HttpErrorResponse"
    ok:false
    status:400
    statusText:"Bad Request"
    url:"http://localhost/api/v3/templates"

}

如何将我收到的消息作为我的错误收到回复     对象没有该响应主体。

3 个答案:

答案 0 :(得分:1)

返回的错误通常是HttpErrorResponse的一个实例,其中error属性包含包装错误(客户端或服务器)

https://angular.io/guide/http#getting-error-details

通常你应该能够像这样处理错误。

add(data) {
 return this.httpClient.post<any>('/api/v3/templates', data)
  .pipe(
      catchError(this.handleError)
    );
}

private handleError(error: HttpErrorResponse) {
  if (error.error instanceof ErrorEvent) {
    // A client-side or network error occurred. Handle it accordingly.
    console.error('An error occurred:', error.error.message);
  } else {
    // The backend returned an unsuccessful response code.
    // The response body may contain clues as to what went wrong,
    console.error(
      `Backend returned code ${error.status}, ` +
      `body was: ${error.error}`);
  }
  // return an ErrorObservable with a user-facing error message
  return new ErrorObservable(
    'Something bad happened; please try again later.');
};

如果error属性为null,则可能是因为服务器没有返回任何内容。您是否使用邮递员或其他工具检查服务器是否返回了相应的响应?

答案 1 :(得分:0)

在Observable中有三个选项。

  • 下一步 - 您订阅了获取数据
  • 错误 - 它是您传递给subscribe方法的下一个函数。它包含错误状态代码,并且主要是http错误,如连接错误,错误请求。
  • 终于 - 它执行任何一切。

还有其他人喜欢地图,去抖等等。

data2 = ['12345678', '23456789', '34567890']
part_list = ['12345678 - Nanners', '23456789 - Nannu Nannu', '34567890 - ROFL Stomp']
for b in data2:
    for part in part_list:
        if b in part :
            print part

我认为你的情况是错误可能不会出现在http标准中,可能会进入订阅状态。

因此,检查自定义消息是否接下来而不是错误。

答案 2 :(得分:0)

您可以使用typed response

error通知类型上,您可以使用以下内容:

err =>  {
        this.localErrorResponse = err as ErrorResponse;
        this.message= this.localErrorResponse.message;
      }

之前,在你的课堂上:

import { ErrorResponse } from './error-response';
...
localErrorResponse: ErrorResponse;
message: string;

然后,您的ErrorResponse就像:

import { HttpHeaders} from './http-headers';

export class ErrorResponse{
  error: any;
  headers: HttpHeaders;
  message: string;
  name: string;
  ok: boolean;
  status: number;
  statusText: string;
  url: string;
}

和班级HttpHeaders

export class HttpHeaders {
  normalizedNames: any;
  lazyUpdate: any;
  lazyInit: any;
}

然后您可以映射其他一些变量,如messagethis.message