This pipe extends Nest's built-in validation pipe and makes it a bit more descriptive.
The default validation pipe is great, but error it returns is just an array of errors:
{
"statusCode": 400,
"error": "Bad Request",
"message": ["email must be an email", "phone should not be empty"]
}
This package changes the message
to be an object with field names as keys:
{
"statusCode": 400,
"error": "Bad Request",
"message": [
{
"field": "email",
"errors": ["email must be an email"]
},
{
"field": "phone",
"errors": ["phone should not be empty"]
}
]
}
It also works with nested validations:
{
"field": "nestedObject.name",
"errors": ["name should not be empty"]
}
So then, on your frontend, you can show each error next to its relavant field, instead of showing all of them at the end of your form
On Yarn:
yarn add nestjs-better-validation
On NPM:
npm install nestjs-better-validation
Just use it as you would normally use Nest's built-in validation pipe. You can also pass options to it, just like you would with the built-in one.
This behavior is achievable by passing a custom exceptionFactory
to the original pipe, but I found myself writing the same exception factory for each one of my projects, so I made this package to do the job.
This filter is just what I personally use for my GraphQL responses. it catches the validation exceptions and returns them as the following object:
@ObjectType()
export class UserError {
@Field(() => [String], { nullable: true })
field: string[];
@Field(() => String)
message: string;
}
Additionally, your returned objects should contain a userErrors
field, for example:
@ObjectType()
export class PostCreatePayload {
@Field(() => Post)
post: Post;
@Field(() => [UserError])
userErrors: UserError[];
}
To use the filter, add it filter to your main.ts file:
import { GraphqlValidationFilter } from 'nestjs-better-validation';
// ...
app.useGlobalFilters(new GraphqlValidationFilter());