为什么拦截器不向订阅者发送 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 完整的 eventObservable<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
        );
      })
    );