[英]How to throw observable error in .map for a http status 200 response in Angular 4
[英]how to throw observable error in angular http interceptor
我試圖在攔截器中拋出一個可觀察到的錯誤,然后處理這個錯誤。 但我不能。 當成功為假時,我也可以收到成功訂閱。
我試圖在next.handle(restReq)
再次返回一個值。 但我失敗了,沒有訂閱任何東西
{
"success": false,
"data": {
"name": "Bad Request",
"message": "123",
"code": 0,
"status": 400,
"type": "yii\\web\\BadRequestHttpException"
}
}
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/internal/Observable';
@Injectable({
providedIn: 'root'
})
export class AuthService {
private sessionUrl = '/wechat/session';
constructor(
private http: HttpClient
) { }
getSession(): Observable<any> {
return this.http.post<any>(this.sessionUrl, {});
}
}
import { Component, OnInit } from '@angular/core';
import { AuthService } from '@core/services/auth.service';
import { interval } from 'rxjs/internal/observable/interval';
import { switchMap, take } from 'rxjs/operators';
@Component({
selector: 'app-auth',
templateUrl: './auth.component.html',
styleUrls: ['./auth.component.scss']
})
export class AuthComponent implements OnInit {
constructor(
private authService: AuthService
) { }
ngOnInit(): void {
this.authService.getLoginQrcode()
.subscribe(
data => console.log(data),
error => console.log(error);
}
}
import { Injectable } from '@angular/core';
import {
HttpErrorResponse,
HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse
} from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class RestInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let baseUrl = environment.baseUrl + '/' + environment.version;
let headers = req.headers;
const restReq = req.clone({
headers,
withCredentials: true
});
return next.handle(restReq);
}
}
嘗試在攔截器中執行此操作
return next.handle(request).map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse && event.body && !event.body.success) {
throw new HttpErrorResponse({
error: 'your error',
headers: evt.headers,
status: 500,
statusText: 'Warning',
url: evt.url
});
}
return event;
);
您可以添加捕獲,並處理錯誤
//....
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/map';
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
constructor(private inj: Injector, private _router: Router) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// Get the auth header from the service.
const auth = this.inj.get(AuthService);
const authToken = auth.getSessionData().accessToken || '';
const duplicate = req.clone({headers: req.headers.set('Authorization', authToken)});
return next.handle(duplicate).catch(this.handleError);
}
private handleError = (response: any) => {
// ....
// Do messaging and error handling here
return Observable.throw(response);
}
嘗試在攔截器中執行此操作
return next.handle(request).map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse && !event.body.success) {
throw new Error(event.body.message);
}
return event;
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.