es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Devolver un observable correcto.

He seguido durante las últimas horas un tutorial sobre tokens de renovación de JWT, pero parece que el código es un poco antiguo y ha habido algunos cambios. Por lo tanto, construí un interceptor que tuvo un problema con el Observable y no sé cómo solucionarlo.

El Error es:

“La función carece de una declaración de retorno final y el tipo de retorno no incluye ‘undefined'”

y sé que se muestra porque mi Observable no tiene un retorno específico.

Mi Código:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<><any>> 
{
    // Verificar si el usuario está iniciando sesión por primera vez

    return next.handle(this.attachTokenToRequest(request)).pipe(
        tap((event: HttpEvent<any>) => {
            if (event instanceof HttpResponse) 
            {
                console.log("Éxito");
            }
        }),
        catchError((err): Observable<any> => { //Aquí viene el mensaje de error
            if (err instanceof HttpErrorResponse) {
                switch ((<httperrorresponse>err).status) 
                {
                    case 401:
                        console.log("Token caducado. Intentando refrescar...");
                        return this.handleHttpResponseError(request, next);
                    case 400:
                        return <any>this.acct.logout();
                }
            } else 
            {
                return throwError(this.handleError);
            }
            //Creo que aquí debería haber un retorno, pero no sé de qué tipo, ya he intentado algunos
        })

       );

}

También puedo mostrarte el código original del tutorial, que es el siguiente enlace:

https://dev.azure.com/Techhowdy/git/NGCoreAuthRTDB?path=/ClientApp/src/app/helpers/jwt.Interceptor.ts

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el mensaje de error está relacionado con el hecho de que la función catchError falta de una declaración de retorno. El mensaje de error específicamente indica que la función “carece de una declaración de retorno final y el tipo de retorno no incluye ‘undefined'”.

    Para solucionar esto, necesita agregar una declaración de retorno al final de su función catchError, con el tipo de retorno apropiado. Basándonos en el código que proporcionó, parece que está devolviendo un tipo Observable<any> o un tipo any según diferentes casos. Debe asegurarse de siempre devolver el mismo tipo consistentemente desde esta función.

    Aquí hay un ejemplo de cómo podría actualizar su código para solucionar este problema:

    catchError((err): Observable<any> => {
      if (err instanceof HttpErrorResponse) {
        switch((<httperrorresponse>err).status) {
          case 401:
            console.log("Token caducado. Intentando refrescar ...");
            return this.handleHttpResponseError(request, next);
          case 400:
            return this.acct.logout();
          default:
            return throwError(this.handleError(err));
        }
      } else {
        return throwError(this.handleError(err));
      }
    })
    

    En este código actualizado, he agregado un caso predeterminado a la declaración switch, y también estoy devolviendo consistentemente un Observable<any> de cada rama de la función. También he agregado una llamada a la función handleError al lanzar un error, asumiendo que esta es una función que ha definido en otro lugar de su código.

    ¡Espero que esto le ayude a resolver el problema con su interceptor!

Comments are closed.