class-验证器不验证数组
class-validator doesn't validate arrays
我无法让 class-validator 工作。好像我没有使用它:一切正常,就好像我没有使用 class-validator 一样。发送带有错误格式正文的请求时,我没有任何验证错误,尽管我应该这样做。
我的 DTO:
import { IsInt, Min, Max } from 'class-validator';
export class PatchForecastDTO {
@IsInt()
@Min(0)
@Max(9)
score1: number;
@IsInt()
@Min(0)
@Max(9)
score2: number;
gameId: string;
}
我的控制器:
@Patch('/:encid/forecasts/updateAll')
async updateForecast(
@Body() patchForecastDTO: PatchForecastDTO[],
@Param('encid') encid: string,
@Query('userId') userId: string
): Promise<ForecastDTO[]> {
return await this.instanceService.updateForecasts(userId, encid, patchForecastDTO);
}
我的bootstrap:
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(PORT);
Logger.log(`Application is running on http://localhost:${PORT}`, 'Bootstrap');
}
bootstrap();
我找不到问题所在。我错过了什么?
NestJS 实际上 does not support array validation out of the box。为了验证一个数组,它必须被包裹在一个对象中。
这样,我不会使用对应于项目列表的 DTO,而是使用对应于 包含项目列表的对象 的 DTO:
import { PatchForecastDTO } from './patch.forecast.dto';
import { IsArray, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';
export class PatchForecastsDTO {
@IsArray()
@ValidateNested() // perform validation on children too
@Type(() => PatchForecastDTO) // cast the payload to the correct DTO type
forecasts: PatchForecastDTO[];
}
我会在我的控制器中使用该 DTO:
@Patch('/:encid/forecasts/updateAll')
async updateForecast(
@Body() patchForecastsDTO: PatchForecastsDTO,
@Param('encid') encid: string,
@Query('userId') userId: string
): Promise<ForecastDTO[]> {
return await this.instanceService.updateForecasts(userId, encid, patchForecastsDTO);
}
在当前版本的 NestJS (7.6.14) 中,支持使用内置 ParseArrayPipe
.
验证作为 JSON 数组的请求主体
@Post()
createBulk(
@Body(new ParseArrayPipe({ items: CreateUserDto }))
createUserDtos: CreateUserDto[],
) {
return 'This action adds new users';
}
有关详细信息,请参阅 official docs or the source code。
我无法让 class-validator 工作。好像我没有使用它:一切正常,就好像我没有使用 class-validator 一样。发送带有错误格式正文的请求时,我没有任何验证错误,尽管我应该这样做。
我的 DTO:
import { IsInt, Min, Max } from 'class-validator';
export class PatchForecastDTO {
@IsInt()
@Min(0)
@Max(9)
score1: number;
@IsInt()
@Min(0)
@Max(9)
score2: number;
gameId: string;
}
我的控制器:
@Patch('/:encid/forecasts/updateAll')
async updateForecast(
@Body() patchForecastDTO: PatchForecastDTO[],
@Param('encid') encid: string,
@Query('userId') userId: string
): Promise<ForecastDTO[]> {
return await this.instanceService.updateForecasts(userId, encid, patchForecastDTO);
}
我的bootstrap:
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(PORT);
Logger.log(`Application is running on http://localhost:${PORT}`, 'Bootstrap');
}
bootstrap();
我找不到问题所在。我错过了什么?
NestJS 实际上 does not support array validation out of the box。为了验证一个数组,它必须被包裹在一个对象中。
这样,我不会使用对应于项目列表的 DTO,而是使用对应于 包含项目列表的对象 的 DTO:
import { PatchForecastDTO } from './patch.forecast.dto';
import { IsArray, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';
export class PatchForecastsDTO {
@IsArray()
@ValidateNested() // perform validation on children too
@Type(() => PatchForecastDTO) // cast the payload to the correct DTO type
forecasts: PatchForecastDTO[];
}
我会在我的控制器中使用该 DTO:
@Patch('/:encid/forecasts/updateAll')
async updateForecast(
@Body() patchForecastsDTO: PatchForecastsDTO,
@Param('encid') encid: string,
@Query('userId') userId: string
): Promise<ForecastDTO[]> {
return await this.instanceService.updateForecasts(userId, encid, patchForecastsDTO);
}
在当前版本的 NestJS (7.6.14) 中,支持使用内置 ParseArrayPipe
.
@Post()
createBulk(
@Body(new ParseArrayPipe({ items: CreateUserDto }))
createUserDtos: CreateUserDto[],
) {
return 'This action adds new users';
}
有关详细信息,请参阅 official docs or the source code。