跳到主要内容

自定义装饰器

custom-decorators

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

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

自定义 @GetUser

// decorator/get-user.decorator.ts
import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const GetUser = createParamDecorator(
(data: 'email' | 'sub' | undefined, ctx: ExecutionContext) => {
const request: Express.Request = ctx.switchToHttp().getRequest();
if (data) {
return request.user[data];
}
return request.user;
},
);

controller 中调用

import { Controller, Get, Req, UseGuards } from '@nestjs/common';
import { User } from '@prisma/client';
import { GetUser } from 'src/auth/decorator';
import { JwtGuard } from 'src/auth/guard';

@UseGuards(JwtGuard)
@Controller('users')
export class UserController {
constructor() {}
@Get('me')
getMe(@GetUser() user: User, @GetUser('email') email: string) {
console.log({ email });
return user;
}
}
提示

调整 @UseGuard 层级,放在 @Controller 上面可以让整个 class 中通用