我使用nestjs上的lib ws来实现websocket网关并使用通用异常过滤器,但是,过滤器不起作用,异常永远不会回调过滤器。
这是我的过滤器,位于 ws-exception.filter.ts
import { Catch, ArgumentsHost } from '@nestjs/common'
import { BaseWsExceptionFilter, WsException } from '@nestjs/websockets'
import { WebSocket } from 'ws'
@Catch()
export class WebSocketExceptions extends BaseWsExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
console.log('AAAAAAAAAAAAAAAAAAAAMEn')
/*
const ws = host.switchToWs().getClient<WebSocket>()
ws.terminate()*/
//super.catch(exception, host)
}
}
这是我的 websocket 网关调用异常,但没有过滤器回调
import {
OnGatewayConnection,
OnGatewayDisconnect,
WebSocketGateway,
WsException,
} from '@nestjs/websockets'
import { IncomingMessage } from 'http'
import { WebSocket } from 'ws'
import { UseFilters } from '@nestjs/common'
import { WebSocketExceptions } from '../ws-exception.filter'
import { verify } from 'jsonwebtoken'
import { config } from 'src/config'
//extends wsg
@WebSocketGateway({ path: '/ws/operator' })
@UseFilters(new WebSocketExceptions())
export class WsOperatorServiceGateway
implements OnGatewayConnection, OnGatewayDisconnect
{
handleConnection(client: WebSocket, req: any) {
console.log('connecting')
this.auth(req)
}
handleDisconnect(client: any) {
console.log('disconnectign')
}
private auth(req: IncomingMessage): any {
const token = this.extractTokenFromHeader(req)
if (!token)
throw new WsException('No Token')
return verify(token, config.serviceSecret)
}
private extractTokenFromHeader(req: IncomingMessage): string | undefined {
const [type, token] = req.headers.authorization?.split(' ') ?? []
return type === 'Bearer' ? token : undefined
}
}
抱歉,如果我的问题很愚蠢,我不久前就开始在nestjs
如果发送异常,我希望能够调用过滤器
您似乎正在尝试以与 HTTP 异常过滤器类似的方式使用 WebSocket 异常过滤器。然而,NestJS WebSocket 中的 WebSocket 异常过滤器的工作方式并不完全相同。
@UseFilters() 装饰器不像控制器那样直接在 WebSocket 网关上使用。相反,您需要使用 exceptionFilters 属性在 @WebSocketGateway() 装饰器中应用过滤器。
以下是如何更正 WsOperatorServiceGateway 以使用 WebSocketExceptions 过滤器:
import {
OnGatewayConnection,
OnGatewayDisconnect,
WebSocketGateway,
WsException,
} from '@nestjs/websockets';
import { IncomingMessage } from 'http';
import { WebSocket } from 'ws';
import { verify } from 'jsonwebtoken';
import { config } from 'src/config';
import { WebSocketExceptions } from '../ws-exception.filter';
@WebSocketGateway({ path: '/ws/operator', exceptionFilters: new WebSocketExceptions() })
export class WsOperatorServiceGateway implements OnGatewayConnection, OnGatewayDisconnect {
handleConnection(client: WebSocket, req: any) {
console.log('connecting');
this.auth(req);
}
handleDisconnect(client: any) {
console.log('disconnecting');
}
private auth(req: IncomingMessage): any {
const token = this.extractTokenFromHeader(req);
if (!token) {
throw new WsException('No Token');
}
return verify(token, config.serviceSecret);
}
private extractTokenFromHeader(req: IncomingMessage): string | undefined {
const [type, token] = req.headers.authorization?.split(' ') ?? [];
return type === 'Bearer' ? token : undefined;
}
}
通过在@WebSocketGateway()装饰器中指定ExceptionFilters: new WebSocketExceptions(),可以确保WebSocket网关中抛出的任何异常都被WebSocketExceptions过滤器捕获。