【发布时间】:2020-06-30 02:43:16
【问题描述】:
我正在尝试在 NestJS 中向我的 WebSocketGateway 添加一些验证。代码如下:
// MessageDTO
import { IsNotEmpty, MinLength } from 'class-validator';
export class MessageDTO {
@IsNotEmpty()
username: string;
@IsNotEmpty()
@MinLength(10)
text: string;
}
// Gateway
import { ValidationPipe, UsePipes } from '@nestjs/common';
import { MessageBody, SubscribeMessage, WebSocketGateway, WsResponse } from '@nestjs/websockets';
import { MessageService } from './message/message.service';
import { MessageDTO } from './message/message.dto';
import { Message } from './message/message.entity';
@WebSocketGateway()
export class AppGateway {
constructor(private readonly messageService: MessageService) {}
@UsePipes(new ValidationPipe())
@SubscribeMessage('message')
async handleMessage(@MessageBody() dto: MessageDTO): Promise<WsResponse<Message>> {
const message = await this.messageService.saveMessage(dto);
return { event: 'message', data: message };
}
}
现在,当我尝试发送不符合验证规则的消息时,它会出错,但客户端始终会收到{ 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 和验证管道,它就像一个魅力 - 使用格式错误的有效负载我会收到格式正确的错误消息。有人能指出我做错了什么吗?
【问题讨论】:
-
您找到解决问题的方法了吗?我也一样
标签: typescript websocket nestjs