0.4.1 • Published 2 years ago

@exonest/better-validation v0.4.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

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 @exonest/better-validation

On NPM:

npm install @exonest/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 '@exonest/better-validation';

// ...
app.useGlobalFilters(new GraphqlValidationFilter());