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」の別個の宣言があります。

class 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 では、コンストラクター プロパティ (パブリック、プライベートなど) の修飾子を含める場合、クラス メンバーも定義し、そのメンバーにコンストラクター引数を割り当てる短い形式の構文を使用しています。

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 に答える