在 Nest 中,网关只是一个用 @WebSocketGateway() 装饰器注释的类。 从技术上讲,网关与平台无关,这使得它们在创建适配器后与任何 WebSockets 库兼容。 开箱即用地支持两个 WS 平台: socket.io 和 ws。
重点 socket.io
安装
yarn add @nestjs/websockets @nestjs/platform-socket.io -S
nest g res ws
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>