为什么拦截器不向订阅者发送 return 数据?
Why does interceptor not return data to subscriber?
我最后使用拦截器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 获取数据
我还尝试 return 观察者中的数据:
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
由于您的拦截器需要 return 完整的 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['result']
重新分配 body
属性
这里有一个 Sample StackBlitz 供您参考。
我用这种方法解决了这个问题:
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
);
})
);
我最后使用拦截器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
.
我还尝试 return 观察者中的数据:
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
由于您的拦截器需要 return 完整的 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['result']
body
属性
这里有一个 Sample StackBlitz 供您参考。
我用这种方法解决了这个问题:
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
);
})
);