在 Nest 中,网关只是一个用 @WebSocketGateway() 装饰器注解的类。从技术上讲,网关与平台无关,这使得它们在创建适配器之后就可以与任何 WebSockets 库兼容。有两个开箱即用的WS平台:socket.io和ws。你可以选择最适合你需要的。另外,您可以按照本指南构建自己的适配器。
官方文档:
https://docs.nestjs.com/websockets/gateways
$ npm i --save @nestjs/websockets @nestjs/platform-socket.io
$ npm i --save-dev @types/socket.io
      
      
nest g gateway events
      
      通过上面命令会在src目录下面生成events.gateway.js
这个里面可以自定义方法接受客户端广播
import { SubscribeMessage, WebSocketGateway, WsResponse, WebSocketServer } from '@nestjs/websockets';
import { Observable, of } from 'rxjs';
import { map } from 'rxjs/operators'
const l = console.log
@WebSocketGateway()
export class EventsGateway {
  @WebSocketServer() server;
  @SubscribeMessage('events')
  onEvent(client: any, payload: any): Observable> | any {
    // this.server.emit('resmsg', data);  // io.emit('resmsg', payload)
    let { name } = payload;
    if (name === 'ajanuw') {
      return of({
        event: 'events',
        data: {
          msg: 'hello ajanuw!'
        }
      })
    }
    if (name === 'alone') {
      return of('hi', '实打实')
        .pipe(
          map($_ =>
            ({
              event: 'events', data: {
                msg: $_
              }
            }))
        );
    }
    return of(payload);
  }
}
       
      
app.module.ts
import { EventsGateway } from './events/events.gateway'
@Module({
  providers: [EventsGateway],
})
      
 
  import { SubscribeMessage, WebSocketGateway,WebSocketServer} from '@nestjs/websockets';
  import { of } from 'rxjs';
  import * as url from "url"
  
  @WebSocketGateway()
  export class EventsGateway {
    @WebSocketServer() server;
    
    private clientsArr:any[]=[];
   
    handleConnection(client: any,){
      
      console.log('有人链接了'+client.id);   
   
    }
  
    handleDisconnect(client:any){
     
    }
    
    @SubscribeMessage('addCart')
    addCart(client: any, payload: any) {
         console.log(payload) 
      
        var roomid=url.parse(client.request.url,true).query.roomid;   /*获取房间号 获取桌号*/
        client.join(roomid);
        // this.server.to(roomid).emit('addCart','Server AddCart Ok');    //广播所有人包含自己
  
        client.broadcast.to(roomid).emit('addCart','Server AddCart Ok');   //不包括自己
  
  
    }
  
  }
  
 
 
  客户端代码:
 
 socket.io socket.io的多房间1111