Fixing class-validator issues in a new Nest js project

This weekend, I played a bit with this express-based node.js framework called Nest. But I'm a bit rusty when it comes to backend. I was coding in PHP... years ago. I am a React developer myself, and in my daily tasks, I write Components with flow typings : so everything in Nest - from classes to Typescript - is unusual to me.

Let's remind first what is a DTO :

A DTO (Data Transfer Object) is an object that defines how the data will be sent over the network.

It defines the shape of data for a specific case, such as creating an user:

CreateuserDto {
    name: 'john',
    password: 'isthissecureENOUGH??123'
}

Or updating the status of a shipping:

UpdateShippingStatusDto {
    status: 'ON_HOLD'
}

So, I love the concept of DTO and I was trying to validate it using ValidationPipe, just like the doc says. It quickly went wrong:

The "class-validator" package is missing. Please, make sure to install this library ($ npm install class-validator) to take advantage of ValidationPipe.

CleanShot 2020-04-05 at 15.44.34.png

Oh. I thought it would work out of the box since ValidationPipe comes from @nest/common, but nevermind, the fix is easy :

npm install class-validator

No more errors in my console ! I carried on and sent a POST request on my endpoint...

Nest: No metadata found. There is more than once class-validator version installed probably. You need to flatten your dependencies.

This one made me crazy. Should I install class-validator as a peer dependency ? Is it a problem in the yarn.lock or in package.json ?

Not at all ! It turned out that my DTO had zero validation rules !

It's that simple : if you get a No metadata found. There is more than once class-validator version installed probably. You need to flatten your dependencies. when using ValidationPipe, triple-check that you have at least one validation rule.

For example:

import { IsNotEmpty } from "class-validator";

export class CreateUserDto {
    @IsNotEmpty()
    firstName: string;
    lastName: string;
}

This stackoverflow comment saved the day. Thanks !