在NestJS WebSocketGateway上处理错误时知道Socket.io事件名称



假设我在NestJS 中有以下WebSocketGateway

@WebSocketGateway()
export class MyWsGateway {
@SubscribeMessage('my-event')
@UserFilters(new MyWsExceptionFilter())
create(@MessageBody() body: any) {
throw new WsException('Forced error');
}
}

在这一点上,我想在出现错误时自定义对客户端的响应,因此我已经基于NestJS官方代码实现了自己的WsExceptionFilter(注意,此代码已简化(:

@Catch(WsException)
export class MyWsExceptionFilter extends BaseWsExceptionFilter {
handleError<TClient extends { emit: Function }>(
client: TClient,
exception: WsException
) {
const message = {status: 'error', message: exception.getError()};
client.emit('here-is-where-i-would-like-to-set-the-event-name', message);
}
}

正如您在BaseWsExceptionFilter的实现中看到的,错误的响应是通过事件"exception"发出的。不过,这对我的案子无效。

经过长时间在互联网上搜索和浏览NestJS的代码,我一直无法找到一种方法来获取/知道引发错误的输入事件名称。

有什么想法吗?

Nestjs使用decorator在函数上附加元数据,包括您要查找的事件名称。您可以使用Reflect.getMetadata(...)访问这些元数据。

因此,如果您引用了引发异常的事件处理程序方法,则可以获得如下消息名称:const messageName = Reflect.getMetadata("message", methodReference)

要获得对处理程序方法的引用,可以使用nestjs拦截器。

async intercept(context, next) {
return next.handle().pipe(tap({
error: (err)=> {
err.eventName = Reflect.getMetadata(
'message', 
(context.switchToWs() as any).handler
)
}
})
}

然后在您的异常过滤器中,您可以访问事件名称!

最新更新