websocket - Nest.js 中特定路由上的 WebSocket
问题描述
我想创建特定的 API 路由,该路由仅用于 WebSocket ( /api/events
),但在所有在 Nest.js 上实现 WebSockets 的示例中,我偶然发现模块被导入AppModule
并且客户端正在向根 URL 发出事件,我不能因为我有这个中间件;
前端.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
:
事件网关.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 {}
有没有办法创建允许服务器-客户端通信的控制器/api/events
?
解决方案
是的,可以在另一条路径上创建 WebsocketGateway。您可以只使用 WebsocketGateway 的选项来配置底层 IO-Connection:
例如:
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({ path: '/api/events', 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;
}
}
这将在http://localhost/api/events上启动 IO-Connection
请记住也要在您的客户端中更改连接路径。它不再是默认的 /socket.io 路径,而是您的示例中的 /api/events 。
推荐阅读
- regex - 只有在前面的字符不是点时才可以(在 sed 中)删除换行符?
- node.js - 关于 Angular 中使用 XLSX 的单元格样式
- html - 更改嵌入式谷歌文档的大小
- c# - 如果少于 4 位,C# double.ToString("F4") 没有填充?
- maven - Maven 测试未创建诱惑结果
- kotlin - 如何将地图转换为地图kotlin
- linux - 修改内存配置寄存器
- c - 什么是 getservbyname() — 我理解对了吗?
- python - Python 3 中套接字子类中的 WinError 10038
- c# - Unity C# 使用带有预设的 AssetImporter 以编程方式修改资产导入设置