我尝试在NestJS中为WebSocketGateway添加一些验证。代码如下:
第一个
现在,当我试图发送一个不符合验证规则的消息时,它会出错,但客户端总是会收到{ status: 'error', message: 'Internal server error'}
。此外,Nest会将错误记录到控制台(我认为这不应该发生......?):
thing_api | Error: Bad Request Exception
thing_api | at ValidationPipe.exceptionFactory (/usr/src/app/node_modules/@nestjs/common/pipes/validation.pipe.js:78:20)
thing_api | at ValidationPipe.transform (/usr/src/app/node_modules/@nestjs/common/pipes/validation.pipe.js:50:24)
thing_api | at processTicksAndRejections (internal/process/task_queues.js:89:5)
thing_api | at async resolveParamValue (/usr/src/app/node_modules/@nestjs/websockets/context/ws-context-creator.js:104:31)
thing_api | at async Promise.all (index 0)
thing_api | at async pipesFn (/usr/src/app/node_modules/@nestjs/websockets/context/ws-context-creator.js:106:13)
thing_api | at async /usr/src/app/node_modules/@nestjs/websockets/context/ws-context-creator.js:41:17
thing_api | at async AppGateway.<anonymous> (/usr/src/app/node_modules/@nestjs/websockets/context/ws-proxy.js:11:32)
thing_api | at async WebSocketsController.pickResult (/usr/src/app/node_modules/@nestjs/websockets/web-sockets-controller.js:85:24)
然而,如果我在常规控制器中使用相同的DTO和验证管道,它就像一个护身符一样工作--使用格式错误的有效负载,我会得到格式正确的错误消息。有人能指出我做错了什么吗?
5条答案
按热度按时间luaexgnf1#
您可以重写the default websocket filter,以捕获http异常和WebSocket异常。
然后在网关中使用它
rdlzhqv92#
BadRequestException
是HttpException
的子类。Nest的默认异常处理程序会检查捕获的异常是否为instanceof WsException
,如果不是,则返回未知异常。要解决这个问题,可以实现一个过滤器,它捕获
BadRequestException
并将其转换为适当的WsException
,然后让Nest的异常过滤器从那里处理异常。ryevplcw3#
ValidationPipe获得了exceptionFactory选项,因此您只需将自定义工厂传递给它,例如:
或扩展内置ValidationPipe
t2a7ltrp4#
我已经创建了套接字验证管道
anauzrmj5#
我用一个扩展
transform
方法的自定义类覆盖了ValidationPipe
类transform
方法,并使用了自定义类。它看起来像这样: