如何通过 JWT 支持简化 Nest.js 控制器实现

问题描述 投票:0回答:1

我正在创建受 JWTAuthGuard 保护的控制器。 有什么办法可以让控制器变小吗? (装饰器、拦截器等)。

我当前的代码:

import {User} from "../../user/entities/user.entity";

interface UserJwtPayload {
    user: {
        id: number,
        email: string
    },
}

class CreateDeviceLocationDto {
    lat: number
    long: number
    description: string
    user: User
}


@UseGuards(JwtAuthGuard)
@Controller('device-locations')
export class DeviceLocationsController {
    constructor(private readonly userService: UserService, private readonly deviceLocationsService: DeviceLocationsService) {
    }

    @Post()
    async create(@Body() createDeviceLocationDto: CreateDeviceLocationDto, @Req() request: Request & UserJwtPayload) {
        const user: User = await this.userService.findOne(request.user.id);

        createDeviceLocationDto.user = user;

        return this.deviceLocationsService.create(createDeviceLocationDto);
    }
}

@Injectable()
export class DeviceLocationsService {
    constructor(
        @InjectRepository(DeviceLocation)
        private readonly devicesLocationRepository: Repository<DeviceLocation>
    ) {
    }

    create(createDeviceLocationDto: CreateDeviceLocationDto) {
        const location = this.devicesLocationRepository.create(createDeviceLocationDto);
        return this.devicesLocationRepository.save(location);
    }
}
  1. 在每个方法中添加
    @Req() request: Request & UserJwtPayload
    很烦人。
  2. 有没有办法将模型保存到数据库(我使用TypeORM)而无需每次都加载用户? (
    const user: User = await this.userService.findOne(request.user.id);
    )?我只需要传递已可从 JWT 令牌获得的用户 ID。

谢谢!

上面的代码有效。如果可能的话,我只是想简化它。

nestjs typeorm
1个回答
0
投票

您可以使用

Gaurds
,这是一个示例:

  @Get('cart')
  @UseGuards(JwtAuthenticationGuard)
  async getCart(@GetCurrentUser() user: UserWithRolesAndOrganizations) {
    return await this.ordersService.getCart({
      userId: user.id,
      organizationId: user.organizationId,
    });
  }

对于

GetCurrentUser
,它看起来像这样:

import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { UserWithRolesAndOrganizations } from '../../users-repository/types/user-roles-organization.type';

export const GetCurrentUser = createParamDecorator(
  (_: undefined, context: ExecutionContext): UserWithRolesAndOrganizations => {
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    return user;
  },
);

但是你可以将你的

request.user.id
移至守卫处。

© www.soinside.com 2019 - 2024. All rights reserved.