Невозможно внедрить сервис в ваш пользовательский декоратор.
Вместо этого вы можете создать AuthGuard
, который имеет доступ к вашему сервису. Затем охранник может добавить свойство к объекту request
, к которому затем можно получить доступ с помощью пользовательского декоратора:
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
const bearerToken = req.header.Authorization;
const user = await this.authService.authenticate(bearerToken);
request.principal = user;
// If you want to allow the request even if auth fails, always return true
return !!user;
}
}
import { createParamDecorator } from '@nestjs/common';
export const Principal = createParamDecorator((data: string, req) => {
return req.principal;
});
и затем в вашем контроллере:
@Get()
@UseGuards(AuthGuard)
get(@Principal() principal: Principal) {
// ...
}
Обратите внимание, что nest предлагает несколько стандартных модулей для аутентификации, см. документы .