javascript - NestJS createParamDecorator returnerar undefined


Jag använder Nest-version ^6.7.2

Jag försöker skapa en createParamDecorator som hämtar req.user-värdet från en begäran.

Inuti createParamDecorator har req.user ett värde, men när jag försöker få värdet i en controller genom att använda dekoratorn är värdet odefinierat.

const AuthSession = createParamDecorator((data, req) => {
  console.log(req.user); // session data
  return req.user;
});
Controller()
export default class AuthController {
  @Get("/token/ping")
  @UseGuards(AuthGuard("jwt"))
  tokenPing(@AuthSession() session: Session) {
    console.log(session); // undefined
    return session;
  }
}

Redigera: Jag försökte just uppdatera till nestjs v7 och jag har samma problem

import { createParamDecorator, ExecutionContext } from "@nestjs/common";

const AuthSession = createParamDecorator((data: any, ctx: ExecutionContext) => {
  return { message: "asdf" };
});

export default AuthSession;
@Controller()
export default class AuthController {
  @Get("/token/ping")
  @UseGuards(AuthGuard("jwt"))
  tokenPing(@AuthSession() session: Session) {
    console.log(session); // undefined
    return session;
  }
}

Svar #1

du kan först få informationen från ExecutionContext:

    import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);

kolla exemplet i dokumentet: Anpassad dekoratör

Svar #2

Jag listade ut vad problemet var. Jag hade en egen validerings-PipeTransform som returnerade undefined om ArgumentMetadata.type varken var "body" eller "param". Så nu returnerar jag bara det första argumentet från validatorns transformmetod (inmatningen) om ArgumentMetadata.type varken är "body" eller "param" och det fixade problemet.

Relaterade artiklar