typescript - ¿Cómo cambiar el formato de los mensajes de error de NestJS controller/class-validator mostrando a qué campo pertenece cada mensaje?
El controlador de NestJS, junto con el class-validator, actualmente devuelve un mensaje de error como este:
{
statusCode: 422,
message: [ 'Name is required', 'Email is required' ],
error: 'Unprocessable Entity'
}
Pero me gustaría vincular cada mensaje a su propiedad relacionada así:
{
statusCode: 422,
message: { name: 'Name is required', email: 'Email is required' },
error: 'Unprocessable Entity'
}
Mi DTO:
import { IsNotEmpty } from 'class-validator';
export class CreateUserRequestDTO {
@IsNotEmpty({ message: 'Name is required' })
name: string;
@IsNotEmpty({ message: 'Email is required' })
email: string;
}
¿Cómo podría cambiar los errores del controlador/class-validator de NestJS para que devuelvan mensajes así?
Respuesta #1
La respuesta para errores de validación puede modificarse pasando exceptionFactory a las opciones de ValidationPipe.
https://docs.nestjs.com/techniques/validation
Vea la implementación de ejemplo:
app.useGlobalPipes(
new ValidationPipe({
exceptionFactory: (errors) => {
return new UnprocessableEntityException({
statusCode: 422,
error: 'Unprocessable Entity',
message: errors.reduce(
(acc, e) => ({
...acc,
[e.property]: Object.values(e.constraints),
}),
{},
),
});
},
}),
);
Respuesta #2
Funciona para un solo objeto, si necesitas código universal, hay otra variante
const errorMessages = {};
function handleErrors(errors: any[], prefix = '') {
errors.forEach((err) => {
if (err.constraints) {
Object.values(err.constraints).forEach((message: string) => {
const fieldName = prefix + err.property;
errorMessages[fieldName] = message;
});
}
if (err.children && err.children.length > 0) {
handleErrors(err.children, `${prefix + err.property}.`);
}
});
}
handleErrors(errors);
resultar en mensajes de error
