# Pipes और Validation — NestJS: Scalable Node.js APIs बनाना

Source: https://www.skillbyai.com/hi/nestjs/nestjs-pipes-validation

> Handlers चलने से पहले ValidationPipe, class-validator DTOs और custom pipes से input validate व transform करें।

## Built-in pipes और class-validator

DTOs को automatically validate करने के लिए `ValidationPipe` को `class-validator` decorators के साथ उपयोग करें।

```typescript
// dto
import { IsString, IsEmail, IsNumber } from 'class-validator';

export class CreateUserDto {
  @IsString()
  name: string;

  @IsEmail()
  email: string;

  @IsNumber()
  age: number;
}

// main.ts
app.useGlobalPipes(new ValidationPipe());
```

## Custom pipes

Unique validation या transformation logic के लिए custom pipe बनाने के लिए `PipeTransform` को implement करें।

```typescript
@Injectable()
export class ParseIntPipe implements PipeTransform<string, number> {
  transform(value: string): number {
    const num = parseInt(value, 10);
    if (isNaN(num)) throw new BadRequestException();
    return num;
  }
}

@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) { ... }
```

## route param पर ParseIntPipe

route params string में आते हैं। `ParseIntPipe` उन्हें number बनाता है या 400 देता है।

- `GET /users/7` पर `id = 7` (number) मिलता है।
- `GET /users/abc` अपने आप `400 Bad Request` लौटाता है।

```ts
import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';

@Controller('users')
export class UsersController {
  @Get(':id')
  findOne(@Param('id', ParseIntPipe) id: number) {
    return { id, type: typeof id };
  }
}
```

Output:

```
{"id":7,"type":"number"}
```

त्वरित जाँच

**Quiz:** `ValidationPipe` default में unknown properties reject नहीं करता। कौन सा option उन्हें हटाता है?

- [x] `whitelist: true`
- [ ] `transform: false`
- [ ] `skipMissingProperties: true`

*Answer:* `whitelist: true`. `whitelist: true` बिना validation decorators वाली properties हटाता है; `forbidNonWhitelisted` उन्हें error बनाता है।
