# AJV beta

This tutorial shows you how you can validate your data with decorators.

Validation feature uses Ajv and json-schema to perform the model validation.

# Installation

Before using the validation decorators, we need to install the ajv module.

npm install --save ajv
npm install --save @tsed/ajv
1
2

Then import @tsed/ajv in your Server:

import {Configuration} from "@tsed/common";
import "@tsed/ajv"; // import ajv ts.ed module

@Configuration({
    rootDir: __dirname
})
export class Server {
}
1
2
3
4
5
6
7
8

The AJV module allows a few settings to be added through the ServerSettings (all are optional):

  • options are AJV specific options passed directly to the AJV constructor,
  • errorFormatter can be used to alter the output produced by the @tsed/ajv package.

The error message could be changed like this:

import {Configuration} from "@tsed/common";
import "@tsed/ajv"; // import ajv ts.ed module

@Configuration({
    rootDir: __dirname,
     ajv: {
       errorFormatter: (error) => `At ${error.modelName}${error.dataPath}, value '${error.data}' ${error.message}`,
       verbose: true
    },
})
export class Server {}
1
2
3
4
5
6
7
8
9
10
11

# Decorators

Ts.ED gives some decorators to write your validation model:

# Examples

# Model validation

A model can be used on a method controller along with @BodyParams or other decorators, and will be validated by Ajv.

import {Required, MaxLength, MinLength, Minimum, Maximum, Format, Enum, Pattern, Email} from "@tsed/common";

export class CalendarModel {
    
    @MaxLength(20)
    @MinLength(3)
    @Required()
    title: string;

    @Minimum(0)
    @Maximum(10)
    rating: number;

    @Email()
    email: string;

    @Format("date")  // or date-time, etc...
    createDate: Date;
    
    @Pattern(/hello/)
    customInput: string;
    
    @Enum("value1", "value2")
    customInput: "value1" | "value2";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# Validation error

When a validation error occurs, AJV generates a list of errors with a full description like this:

[
  {
    "keyword": "minLength",
    "dataPath": ".password",
    "schemaPath": "#/properties/password/minLength",
    "params": {"limit": 6},
    "message": "should NOT be shorter than 6 characters",
    "modelName": "User"
  }
]
1
2
3
4
5
6
7
8
9
10

This information can be retrieved in the response headers:

 connection: keep-alive
 content-length: 18
 content-type: text/html; charset=utf-8
 date: Wed, 16 May 2018 07:32:23 GMT
 errors: [{"keyword": "minLength","dataPath": ".password", "schemaPath": "#/properties/password/minLength", "params": {"limit": 6}, "message": "should NOT be shorter than 6 characters", "modelName": "User"}]
 etag: W/"12-Bpa0T7/lBA6+IACzRWwBc4S6NUY"
 vary: Accept-Encoding
 x-powered-by: Express
1
2
3
4
5
6
7
8