Tengo solicitudes en mi controlador, @Param es la versión de cadena de MongoId. Si llamo a esta solicitud con un formato no válido de la cadena, que no coincide con el formato MongoId, la solicitud se procesa hasta que la llamada MongoDB arroja un error interno del servidor.
¿Cómo valido que, por ejemplo, "aaa" o "ANWPINREBAFSOFASD" no se valide y se detenga lo antes posible en mis solicitudes?
Extremo del controlador actual:
@Get(':id') @ApiOperation({ summary: 'Get nice information' }) findOne( @Param('id') id: string) { return this.niceService.findOne(id); }El servicio que se llama:
async findOne(id: string): Promise<NiceDocument> { const niceResult: NiceDocument = await this.NiceSchema.findById(id) if (!niceResult) { throw new NotFoundException() } return table }La respuesta a esto es usar una tubería de validación personalizada:
Cree la tubería y expórtela:
import { ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from "@nestjs/common"; import {ObjectId} from 'mongodb' @Injectable() export class ValidateMongoId implements PipeTransform<string> { transform(value: string, metadata: ArgumentMetadata): string{ // Optional casting into ObjectId if wanted! if(ObjectId.isValid(value)){ if((String)(new ObjectId(value)) === value) return value; throw new BadRequestException } throw new BadRequestException }; }Use la tubería en el controlador para validar la cadena
@Get(':id') @ApiOperation({ summary: 'Get nice information' }) findOne( @Param('id', ValidateMongoId) id: string) { return this.niceService.findOne(id); }Alternativamente, puede cambiar el tipo de retorno en la tubería de cadena a ObjectId si está usando mongoDB en lugar de mongoose, mongoose admite solicitudes con la identificación en un formato de cadena
use el validador de clase en nestjs
usando @IsMongoIdObject()
como esto:
class ParamDTO{ @IsMongoIdObject() id:string }----Su función---
@Get(':id') @ApiOperation({ summary: 'Get nice information' }) findOne( @Param() id: ParamDTO) { return this.niceService.findOne(id.id); }