异常过滤器 Nestjs 无法在我的 websocket 网关上工作

问题描述 投票:0回答:1

我使用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

如果发送异常,我希望能够调用过滤器

javascript typescript websocket nestjs ws
1个回答
0
投票

您似乎正在尝试以与 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过滤器捕获。

© www.soinside.com 2019 - 2024. All rights reserved.