Search code examples
typescriptdependency-injectionnestjsprovidergateway

NestJS Gateway dependency injection


I have a service called "PlayerService" and the gateway calls "Player Gateway", the PlayersGateway has dependency of PlayerService, but I can't inject o service inside gateway.

PlayerGateway

@UseInterceptors(RedisPropagatorInterceptor)
@WebSocketGateway()
@Injectable()
export class PlayerGateway
  extends BaseGateway
  implements OnGatewayConnection, OnGatewayInit, OnGatewayDisconnect {

constructor(private playerService: PlayerService) {
    super();
  }

PlayerService

@Injectable()
export class PlayerService extends BaseService<Player> {
  protected fieldsSearchable: FieldsSearchable = {};

  private logger = new Logger('PlayerService');

  constructor(
    @InjectRepository(PlayerRepository)
    repository: PlayerRepository,
    @Inject(REQUEST) protected request: Request,
    private redisService: RedisService,
  ) {
    super();
    this.setRepository(repository);
  }

PlayerModule

@Module({
  imports: [
    TypeOrmModule.forFeature([Player, PlayerRepository]),
    RedisModule,
    SocketModule,
    RedisPropagatorModule,
  ],
  controllers: [PlayerController],
  exports: [TypeOrmModule, PlayerService],
  providers: [PlayerService, PlayerGateway],
})
export class PlayerModule {}

Modules.ts

@Module({
  imports: [
    RedisModule,
    SocketModule,
    RedisPropagatorModule,
    SessionModule,
    PlayerModule,
  ],
  exports: [RedisModule, SocketModule],
  controllers: [],
  providers: [ServerGateway, NetworkGateway],
})

What I want to know is how can I inject the service inside gateway or a way to make something like this rsrs


Solution

  • Your PlayerService is trying to inject the request:

    @Inject(REQUEST) protected request: Request

    This doesn't make sense for constructing an instance of a Gateway as it should be independent of any individual HTTP request. Do you actually need to have access to the request inside your PlayerService? If so you'll have to split this apart into separate services