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);
}
);
答
尝试在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
错误对象上的json被格式化为一个字符串,而不是一个对象。你是否控制服务器?如果是这样,通过摆脱错误对象周围的引号来修复它。如果不是,用JSON解析响应.parse – bryan60
看看例如https://github.com/angular/angular/issues/18682 – jonrsharpe
@ bryan60是的我有控制服务器返回的数据,但我不认为问题来自那里,因为'curl'返回的响应在命令行是好的(即一个JSON对象) – h4k1m