在nest.js中,是否可以在param装饰器中获取服务实例?

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

我希望使用nest.js实现类似的东西:(与Spring框架非常相似)

@Controller('/test')
class TestController {
  @Get()
  get(@Principal() principal: Principal) {

  }
}

经过几个小时的阅读文档,我发现nest.js支持创建自定义装饰器。所以我决定实现自己的@Principal装饰器。装饰器负责从http头检索访问令牌,并使用令牌从我自己的auth服务获取用户的主体。

import { createParamDecorator } from '@nestjs/common';

export const Principal = createParamDecorator((data: string, req) => {
  const bearerToken = req.header.Authorization;
  // parse.. and call my authService..
  // how to call my authService here?
  return null;
});

但问题是我不知道如何在装饰器处理程序中获取我的服务实例。可能吗?如何?先感谢您

javascript node.js typescript decorator nestjs
1个回答
3
投票

无法将服务注入到自定义装饰器中。

相反,您可以创建一个可以访问您的服务的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提供了一些用于身份验证的标准模块,请参阅docs

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