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.
