Ba option giải quyết ba việc khác nhau:
whitelist: true— loại bỏ mọi property không có decorator validation trong DTO. Chống mass assignment (client gửi kèmisAdmin: true).forbidNonWhitelisted: true— thay vì loại bỏ im lặng thì ném 400 khi có property lạ. Dùng khi muốn client biết mình gửi sai.transform: true— chuyển plain object thành instance của class DTO và ép kiểu primitive theo khai báo TypeScript.
ts
app.useGlobalPipes(new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
transformOptions: { enableImplicitConversion: true },
}))Gotcha hay bị hỏi: query param và route param luôn là string.
- Với
@IsInt()trênpage: number, validation sẽ fail vì'2'không phải số. - Cách xử lý: bật
enableImplicitConversion, hoặc khai báo tường minh bằng@Type(() => Number)củaclass-transformer— cách này rõ ràng và an toàn hơn khi DTO có field kiểu phức tạp:
ts
export class ListQueryDto {
@Type(() => Number)
@IsInt()
@Min(1)
page = 1
}