您在需要流的地方提供了“未定义” HttpInterceptor 中的错误

问题描述

我已经看到并尝试了很多其他描述相同问题的线程,但找不到解决方案。我是角度技术的初学者。我正在使用 angular 11。我正在尝试刷新 HttpInterceptor 类中的 JWT 令牌

this.loginService.checkRefreshToken(this.refreshtoke).pipe(
switchMap((tokenResponse: any) => {
          if (tokenResponse) {
            localStorage.setItem('authToken',tokenResponse.Token)
            localStorage.setItem('refreshToken',tokenResponse.RefreshToken)
            this.tokenSubject.next(tokenResponse);
            console.log('token refreshed');
            return next.handle(this.attachAuthToken(request));
          }
          else return <any>this.loginService.logoutUser();
        })
      );

上面是我的拦截器类调用登录服务

checkRefreshToken(data : Irefreshtoken) : Observable<any> {
        var body = JSON.stringify(data)
    const httpOptions = {
      headers: new HttpHeaders({
          'Content-Type': 'application/json','Authorization': 'my-auth-token'
      }),};

    const postURL = this.constants.API_ENDPOINT + this.constants.CheckRefreshToken;

    return this.http.post<any>(postURL,data,httpOptions)
        .pipe(
            tap((result: any) => {
            localStorage.setItem('authToken',result.Token)
            localStorage.setItem('refreshToken',result.RefreshToken)
        })
    );

这是我的登录服务功能

[HttpPost]
        [Route("CheckRefreshToken")]
        public async Task<IActionResult> CheckRefreshToken(RefreshToken data)

这是我的控制器方法

后期调用没有到达后端,总是以错误结束

ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable,Promise,Array,or Iterable.
    at subscribeto (subscribeto.js:27)
    at innerSubscribe (innerSubscribe.js:69)
    at CatchSubscriber.error (catchError.js:36)
    at XMLHttpRequest.onLoad (http.js:1700)
    at ZoneDelegate.invokeTask (zone-evergreen.js:402)
    at Object.onInvokeTask (core.js:28499)
    at ZoneDelegate.invokeTask (zone-evergreen.js:401)
    at Zone.runTask (zone-evergreen.js:174)
    at ZoneTask.invokeTask [as invoke] (zone-evergreen.js:483)
    at invokeTask (zone-evergreen.js:1596)

我知道这是角度的一般错误。任何帮助都感激不尽。如果我在某处错了,请纠正我。这些代码是从教程代码中复制过来的

感谢您的帮助

解决方法

您可以删除 checkRefreshToken 中的管道并返回 this.http.post<any>(postURL,data,httpOptions)。保存在本地存储的逻辑已经在拦截器中完成了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...