1

我在nestjs中使用nest-keycloak-connect,我想创建我自己的类,从AuthGuard类扩展以获得一些自定义功能

我试过了,效果很好


  @Injectable()
  export class KeycloakAuthGuard extends AuthGuard implements CanActivate {
    canActivate(context: ExecutionContext) {
        const value = super.canActivate(context);
        const [request] = extractRequest(context);
        console.log(' ++++++++++++++++++ ++++++++++++++ ', request.user); //getting user here

        // Some Custom functionality here..... like call any external request

        return value;
    }
  }

但是我需要添加一个构造函数,这样我就可以在这里使用一些服务,比如 HttpService 谁能帮我看看我该怎么做?

constructor(private http: HttpService) { super() //contructor requires 4 arguments }

如果我给构造函数参数,比如

constructor(
        private http: HttpService,
        @Inject(KEYCLOAK_INSTANCE)
        private keycloak: any,
        @Inject(KEYCLOAK_CONNECT_OPTIONS)
        private keycloakOpts: any,
        @Inject(KEYCLOAK_LOGGER)
        private logger: Logger,
        private readonly reflector: Reflector,
    ) {
        super(
            keycloak,
            keycloakOpts,
            logger,
            reflector
        );
    }

我遇到了这个错误

“KeycloakAuthGuard”类错误地扩展了基类“AuthGuard”。类型具有私有属性“keycloak”的单独声明。

您可以在这里找到 类 AuthGaurd代码: https ://github.com/ferrerojosh/nest-keycloak-connect/blob/master/src/guards/auth.guard.ts

nest-keycloak-connect 包 https://www.npmjs.com/package/nest-keycloak-connect

4

2 回答 2

1

在 Typescript 中,当您为构造函数属性(例如,public、private)包含修饰符时,您使用的是一种简短形式的语法,该语法还定义了一个类成员并将构造函数参数分配给该成员。

class MyClass {
  constructor(private readonly thing: number) { }
}

是缩写形式

class MyClass {
  private readonly thing: number;

  constructor(thing: number) { 
     this.thing = thing;
  }
}

因此,如果您只是删除private前面的修饰符,private keycloak: any,您只需将值作为构造函数参数接收,然后您可以将其传递给super它而不会与基类中的现有类成员发生冲突

于 2021-08-11T14:45:20.963 回答
1

好的,所以我从图书馆作者那里得到的是

重命名构造函数属性,因为它们会与超类冲突。

constructor(
  @Inject(KEYCLOAK_INSTANCE)
  private keycloak1: any
  @Inject(KEYCLOAK_CONNECT_OPTIONS)
  private keycloakOpts1: any,
  @Inject(KEYCLOAK_LOGGER)
  private logger1: Logger,
  private readonly reflector1: Reflector
)
于 2021-08-15T13:41:29.687 回答