Angular 6 RxJS,订户未获得价值

时间:2018-08-21 13:53:16

标签: angular rxjs

我有一个login.component

  login() {
    this.accountService.login(this.model)
      .subscribe(
        response => {
            //do stuff
        },
        (error: AppError) => {
         // do stuff
        },  
      );

登录服务

   login(loginModel: LoginModel) {
    return this.http.post('auth/login/', loginModel).pipe(
      tap(response => {
        if (response) {
         //add jwt to local storage
         }
     }));
     }

和一个httpinterceptor

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const headerSettings: { [ name: string ]: string | string[]; } = {};

    return this.localStorage.getItem(AppStorageKeys.JWT).pipe(
      mergeMap((token: any) => {
        if (token)
          //add to headers etc

        const apiReq = req.clone({ url: `${environment.apiBase}/${req.url}`, headers: newHeader });
        return next.handle(apiReq);
      }));
     }

登录失败时,login.component显示错误。登录成功后,便可以从api中成功检索到令牌,正如我在开发工具中的“网络”标签中所看到的那样,但是该值从未存储在login.service的map函数中,也没有调用response => {}函数在login.component.ts中-会出错吗?

我在做什么错了?

-----编辑:

我已经创建了一个stackblitz,但是它正在那里工作,这使我相信这可能是因为我的login.component和服务位于子模块中,并且与拦截器有关。

1 个答案:

答案 0 :(得分:1)

如注释中所述,默认情况下,Angular 6 HttpClient仅接受JSON作为响应。为了更改可接受的响应类型,请向post函数调用中添加第三个参数,如下所示:

return this.http.post('auth/login/', loginModel, {responseType: 'text'})

有关更多信息,请参见:https://angular.io/guide/http#requesting-non-json-data