NestJS WebSocket

344 阅读1分钟

在 Nest 中,网关只是一个用 @WebSocketGateway() 装饰器注释的类。 从技术上讲,网关与平台无关,这使得它们在创建适配器后与任何 WebSockets 库兼容。 开箱即用地支持两个 WS 平台: socket.io 和 ws

重点 socket.io

安装
yarn add @nestjs/websockets @nestjs/platform-socket.io -S
nest g res ws

image.png

ws.gateway.ts

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

@WebSocketGateway({
  cors: {
    origin: '*',
  },
})
export class WsGateway {
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('events')
  findAll(@MessageBody() data: any) {
    console.log('findAll', data);
    setInterval(()=>{
      this.server.emit('events', {
        name: '郑州小张',
        age: 18,
      });
    },2000)
  }

  @SubscribeMessage('identity')
  async identity(@MessageBody() data: number): Promise<number> {
    console.log('identity', data);
    return data;
  }
}

index.html

<html>
  <head>
    <script src="https://cdn.socket.io/4.3.2/socket.io.min.js" integrity="sha384-KAZ4DtjNhLChOB/hxXuKqhMLYvx3b5MlT55xPEiNmREKRzeEm+RVPlTnAn0ajQNs" crossorigin="anonymous"></script>
    <script>
      const socket = io('http://localhost:3000');
      socket.on('connect', function() {
        console.log('Connected');

        socket.emit('events', { test: 'test' });
        socket.emit('identity', 0, response =>
          console.log('Identity:', response),
        );
      });
      socket.on('events', function(data) {
        console.log('event', data);
      });
      socket.on('exception', function(data) {
        console.log('event', data);
      });
      socket.on('disconnect', function() {
        console.log('Disconnected');
      });
    </script>
  </head>

  <body></body>
</html>

image.png

image.png