Angular4 - 返回的Http错误是字符串而不是对象

问题描述:

我在Angular 4中使用其内置的HttpClient类进行Http请求。一切正常,但返回的错误变量存在一个小问题。Angular4 - 返回的Http错误是字符串而不是对象

当我post错误的用户名/密码组合登录用户,错误对象返回包含error键,它的值预计为Object,但我得到一个string代替。请在下面看到**之间的文字以了解问题的具体含义:

{**error: "{"non_field_errors":["Unable to login with provided credentials."]}"**, headers: Object, status: 400, statusText: "Bad Request", url: "http://mymedicine.loc/api/auth/login/", ok: false, name: "HttpErrorResponse", message: "Http failure response for http://project.loc/api/auth/login/: 400 Bad Request"} 

什么可能会导致此类问题?我需要在那里有一个对象,这样我才能让用户知道认证过程中出了什么问题。 我需要准确的说,当提供正确的证书并且我已经在我发送HTTP请求的网络服务器上激活CORS时,验证工作正常。

下面是一小段代码提取它执行POST http请求:

interface ErrorMessage { 
    username: string[1]; 
    password: string[1]; 
    non_field_errors: string[1]; 
} 

interface ErrorResponse { 
    error: ErrorMessage; 
} 

// get token from the server 
this.http.post<TokenResponse>('http://myproject.loc/api/auth/login/', body).subscribe(
    (res: TokenResponse) => { 
     // login with token 
     this.auth.login(res.auth_token); 

     // redirect 
     this.router.navigateByUrl('/url'); 
    }, 
    (err: ErrorResponse) => { 
     let error = err.error; 
     console.dir(err); 
    } 
); 
+0

错误对象上的json被格式化为一个字符串,而不是一个对象。你是否控制服务器?如果是这样,通过摆脱错误对象周围的引号来修复它。如果不是,用JSON解析响应.parse – bryan60

+2

看看例如https://github.com/angular/angular/issues/18682 – jonrsharpe

+0

@ bryan60是的我有控制服务器返回的数据,但我不认为问题来自那里,因为'curl'返回的响应在命令行是好的(即一个JSON对象) – h4k1m

内容类型设置为JSON这个错误似乎已经被AngularAngular-cli的最新版本根据source修复,而我没有与Angular 4.4.6修复。

尝试在POST请求的标头的服务器

const headers = new HttpHeaders().set('Content-Type', 'application/json; charset=utf-8'); 

return this.http.post<TokenResponse>('/api/auth/login/', body, {headers: headers}) 
      .map(res => { 
       return {token: res.auth_token}; 
      }).catch((error: HttpErrorResponse) => { 
       if (err.error) { 
        console.log(err.error); 
       } 
       return _throw(err); 
     }); 
+0

设置内容类型并不能解决这个问题(实际上,内容类型已经在'json'事件中,而没有明确地设置它)。 – h4k1m