我正在创建受 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);
}
}
@Req() request: Request & UserJwtPayload
很烦人。const user: User = await this.userService.findOne(request.user.id);
)?我只需要传递已可从 JWT 令牌获得的用户 ID。谢谢!
上面的代码有效。如果可能的话,我只是想简化它。
您可以使用
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
移至守卫处。