Websocket 适配器中的 NestJS 依赖注入

NestJS Dependency Injection in Websocket Adapter

我正在尝试在 NestJS 应用程序中建立 websocket 连接时验证和检查用户的权限。

我找到了 this discussion which recommends to make use of NestJS Websocket adapter。您可以在 options.allowRequest 回调中执行令牌验证,如下所示。

export class AuthenticatedSocketIoAdapter extends IoAdapter {

  private readonly authService: AuthService;
  constructor(private app: INestApplicationContext) {
    super(app);
    this.authService = app.get(AuthService);
  }

  createIOServer(port: number, options?: SocketIO.ServerOptions): any {
    options.allowRequest = async (request, allowFunction) => {

      const token = request.headers.authorization.replace('Bearer ', '');

      const verified = this.authService.verifyToken(token);
      if (verified) {
        return allowFunction(null, true);
      }
      
      return allowFunction('Unauthorized', false);
    };

    return super.createIOServer(port, options);
  }
}

但是我在 websocket 适配器中的依赖项注入有问题。 IoAdapter 的构造函数有一个 INestApplicationContext 参数,我试图从中使用 app.get(AuthService) 取回 AuthService,如上所示。

AuthService 注入了另外两个服务,UserServiceJwtService 来检查 JWT 令牌。我的问题是那些服务在那个上下文中仍然没有定义。

@Injectable()
export class AuthService {
  constructor(private usersService: UsersService, private jwtService: JwtService) {}

  verifyToken(token: string): boolean {
    // Problem: this.jwtService is undefined
    const user = this.jwtService.verify(token, { publicKey });
    // ... check user has permissions and return result
  }

有关信息,AuthService 在定义 Websocket 的模块之外的另一个模块中。我还尝试在当前模块中导入 AuthService(及其依赖项),但这没有帮助。

是否可以使用 app.get() 方法使用该服务?

我可以使用 app.resolve() 而不是 app.get()

来解决 DI 问题
export class AuthenticatedSocketIoAdapter extends IoAdapter {
  private authService: AuthService;

  constructor(private app: INestApplicationContext) {
    super(app);
    app.resolve<AuthService>(AuthService).then((authService) => {
      this.authService = authService;
    });
  }
}

这解决了未定义 AuthService 中注入的 jwtService