问题我试图修复: 我在控制台中找不到很多404,我想处理这些。
我的角度代码中有这两种方法:
getUserByEmailAddress(email: string): Observable<User> {
return this._http.get<User>("http://webapi.local/api/v2.0/users?email=" + email);
}
isEmailAddressAvailable(email: string) {
var user: User;
var response = this.getUserByEmailAddress(email);
response.subscribe(
usr => user == usr,
error => user == undefined);
if (user === undefined) {
return true;
}
else {
return false;
}
}
这可以正常工作,如果没有找到用户,则在调用结束点时发现404未返回。
我想做什么
我想在getUserByEmailAddress()中的.get()请求中添加一个.catch()来处理这些404并屏蔽它们出现在控制台中,但是当我尝试添加它时,我不会了解我需要为观察者返回的内容,我已尝试过:
.catch(err => { return Observable.of(undefined)})
但我不认为这是对的。
感谢您的帮助!
答案 0 :(得分:1)
为了处理我的应用程序中的404错误,我所做的是在catch块中
if(err.status == 404)
return Observable.throw(new NotFoundError())
else
return Observable.throw(new AppError(err))
但首先你必须创建两个名为AppError的类,它们将被分配给所有错误,而notfoundError将被分配给404错误,这将是AppError的一个实例 IN apperror.ts
export class AppError {
constructor(public err?:any){
console.log(err);
}
}
和notFound.ts
import { AppError } from "./apperror";
export class NotFoundError extends AppError {
}
然后在订阅中你可以像这样处理这些错误
response.subscribe(
usr => user == usr,
((err:Error)=>{
if(err instanceof NotFoundError){
alert(err)
}
})
答案 1 :(得分:1)
您可以继续使用map或do方法来检查状态代码。
getUserByEmailAddress(email: string): Observable<User> {
return this._http.get<User>("http://webapi.local/api/v2.0/users?email=" + email).map(res => {
if(res.status ==404) {
throw new Error('This request has failed ' + res.status);
}
else {
return res.json();
}
}).catch(err => {
//custom logic goes here
return Observable.throw(err);
});
}
带有'do'的片段
getUserByEmailAddress(email: string): Observable<User> {
return this._http.get<User>("http://webapi.local/api/v2.0/users?email=" + email).do(res => {
if(res.status ==404) {
//custom logic goes here
}
});
答案 2 :(得分:0)
我认为最好的解决方案是http拦截器。然后你可以检查请求的响应是否为404返回Observable.empty()