/nestjs-better-validation

A better validation pipe for NestJS.

Primary LanguageTypeScriptMIT LicenseMIT

Better Validation Pipe

This pipe extends Nest's built-in validation pipe and makes it a bit more descriptive.

Introduction

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

Installation

On Yarn:

yarn add nestjs-better-validation

On NPM:

npm install nestjs-better-validation

Usage

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.

Motivation

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.

GraphQL Validation Filter

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());