0

我正在使用 nestjs 并想设置一个工作流程:

          http           websocket
External----------Server----------Clients
   |      event     |                |
   |===============>|                |
   |                |     event      |
   |                |===============>|

我已经使用示例repo中的代码设置了nestjs 网关,并准备了一个发送给所有客户端的方法。WsAdapterbroadcast

@WebSocketGateway({
  transports: ['websocket'],
  path: '/websocket',
})
export class AppGateway {
  @WebSocketServer()
  server: Server;
  protected logger: Logger = new Logger('AppGateway');

  handleConnection(): void {
    this.logger.debug('handleConnection');
  }
  handleDisconnect(): void {
    this.logger.debug('handleDisconnect');
  }

  async broadcast(data: any): Promise<void> {
    this.logger.debug('broadcast', JSON.stringify(data));
    this.server.clients.forEach((client) => client.send(JSON.stringify(data)));
  }
}

我有一个广播控制器供外部服务调用POST http://myserver/api/broadcast

@Controller('broadcast')
export class BroadcastController {
  logger: Logger = new Logger('BroadcastController');

  constructor(private broadcastService: BroadcastService) {}

  @Post()
  async doBroadcast(@Req() request: Request): Promise<void> {
    this.logger.debug('doBroadcast', request.body);

    try {
      await this.broadcastService.enqueue(JSON.stringify(request.body));
    } catch (error) {
      this.logger.error(error);
    }
  }
}

我有一个队列BroadcastService排队广播事件。

@Injectable()
export class BroadcastService {
  protected logger: Logger = new Logger('BroadcastService');

  constructor(
    @Inject(CACHE_MANAGER) private cache: Cache,
    @InjectQueue('broadcast') private queue: Queue,
  ) {}

  async enqueue(data: string): Promise<void> {
    this.queue.add('broadcast', data, {});
  }
}

如何让网关从broadcast队列和调用broadcast方法中获取项目?

到目前为止,我只看到了这样的示例,即在@SubscribeMessage('xxx')从任何客户端(通过)接收到消息后,服务器将消息广播给所有客户端。但现在触发器是队列消息。

4

0 回答 0