WebSockets по определенному маршруту в Nest.js - PullRequest
0 голосов
/ 21 июня 2019

Я хотел бы создать конкретный маршрут API, который будет использоваться только WebSocket (/api/events), но во всех примерах реализации WebSockets в Nest.js, на который я наткнулся, модуль импортируется в AppModule, и клиент отправляет события в направлениикорневой URL, который я не могу сделать, потому что у меня есть это промежуточное ПО;

frontend.middleware.ts

import { Request, Response } from 'express';
import { AppModule } from '../../app.module';

export function FrontendMiddleware(
  req: Request,
  res: Response,
  next: Function,
) {
  const { baseUrl } = req;
  if (baseUrl.indexOf('/api') === 0) {
    next();
  } else {
    res.sendFile('index.html', { root: AppModule.getStaticAssetsRootPath() });
  }
}

Вот EventGateway и EventModule:

event.gateway.ts

import {
  SubscribeMessage,
  WebSocketGateway,
  WebSocketServer,
  WsResponse,
} from '@nestjs/websockets';
import { from, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Client, Server } from 'socket.io';

@WebSocketGateway({ namespace: 'events' })
export class EventGateway {
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('events')
  findAll(client: Client, data: any): Observable<WsResponse<number>> {
    return from([1, 2, 3]).pipe(map(item => ({ event: 'events', data: item })));
  }

  @SubscribeMessage('identity')
  async identity(client: Client, data: number): Promise<number> {
    return data;
  }
}

event.module.ts

import { Module } from '@nestjs/common';
import { EventGateway } from './event.gateway';

@Module({
  components: [EventGateway],
})
export class EventModule {}

Isесть способ создать контроллер, который позволит общаться между сервером и клиентом через /api/events?

1 Ответ

0 голосов
/ 21 июня 2019

Websocket работает на сервере, а не на конечной точке.Следовательно, он не может прослушивать запросы по определенному маршруту, а просто через порт, который для конфигурации Nest по умолчанию совпадает с HTTP.

Вы можете использовать обратный прокси-сервер, такой как Nginx, для перенаправлениязапросы к /api/events, обращенные к серверу Websocket, а также обрабатывают перенаправление на index.html без изменения даже порта сервера Websocket.Тогда вам не понадобится класс FrontendMiddleware.Это также лучше, поскольку приложение не берет на себя бремя управления перенаправлениями запросов.

...