我在上一个Angular中使用了拦截器:
return next.handle(request).pipe(
map((event: any) => {
if (request.method == "GET") {
return event;
}
if (request.method == "POST") {
if (event.body) {
return event.body["result"];
}
}
return event;
}));
因此,我检查是否为POST
请求,我希望使用键result
从JSON获取数据。
我还试图在Observer中返回数据:
if (event.body) {
return Observable.of(event.body["result"]);
}
订阅为:
this.method.subscribe(res => {
console.log(res);
});
看看这张照片:
console.log(event); // This is default event - first selected area
console.log(eventToSend); /./ This is modified - second selected area
区别是HttpResponse类型,它缺少第二个修改后的对象eventToSend
答案 0 :(得分:1)
由于您的拦截器需要返回完整的event
(类型为Observable<HttpEvent<any>>
),而不是仅返回响应body
,但是您仍然希望仅在result
中返回回复body
,请尝试以下操作:
return next.handle(request).pipe(
map((event: any) => {
// Removing this as it is redundant
/*if (request.method == "GET") {
return event;
}*/
if (request.method == "POST") {
if (event.body) {
const eventToSend = { ...event };
eventToSend.body = event.body["result"];
return eventToSend;
}
}
return event;
}));
在这里,我们将散布整个event
对象,然后使用body
在其上重新分配body['result']
属性
这是您推荐的Sample StackBlitz。
答案 1 :(得分:0)
我使用这种方法解决了这个问题:
return next.handle(request).pipe(
map((event: any) => {
if (request.method == "POST") {
if (request.body["$type"] == "LoginRequest") {
return event;
}
if (event.body) {
event.body = event.body["result"];
}
}
return event;
}),
catchError((error: HttpErrorResponse) => {
if (error.status === 401) {
this.route.navigate(["/login"]);
}
return throwError(
"Ошибка сервера RequestInterception: " + error.message || error
);
})
);