为什么拦截器不将数据返回给订户?

时间:2018-11-10 16:57:27

标签: angular angular-http-interceptors angular7

我在上一个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

enter image description here

区别是HttpResponse类型,它缺少第二个修改后的对象eventToSend

2 个答案:

答案 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
        );
      })
    );