Проблема в том, что у вас есть простая строка здесь. Чтобы проверка с class-validator
работала, вы должны создать экземпляр класса, в вашем случае ResourceId
. Встроенный ValidationPipe
ожидает, что значение будет {id: '123'}
вместо '123'
, чтобы иметь возможность автоматически преобразовать его. Но вы можете легко создать свой собственный канал проверки, который выполняет это дополнительное преобразование.
export class ParamValidationPipe implements PipeTransform {
async transform(value, metadata: ArgumentMetadata) {
if (metadata.type === 'param') {
// This is the relevant part: value -> { id: value }
const valueInstance = plainToClass(metadata.metatype, { id: value });
const validationErrors = await validate(valueInstance);
if (validationErrors.length > 0) {
throw new BadRequestException(validationErrors, 'Invalid route param');
}
return valueInstance;
} else {
return value;
}
}
}
Затем вы можете использовать его на своем контроллере:
@UsePipes(ParamValidationPipe)
@Get(':companyId/departments/:departmentId/employees')
getEmployees(
@Param('companyId') companyId: ResourceId,
@Param('departmentId') departmentId: ResourceId,
) {
return `id1: ${companyId.id}, id2: ${departmentId.id}`;
}