首页 > 解决方案 > 将数据传递给服务时验证控制器中的 DTO

问题描述

我正在尝试在 PUT 请求中插入验证(以更新存储在 MongoDB 中的一些数据):

DTO:

export enum reportFields {
    'startDate',
    'targetDateOfCompletion',
    'duration',
}


export class updateScheduleDto {
    @IsOptional()
    @IsString()
    readonly frequency?: string;

    @IsOptional()
    @IsArray()
    @IsEmail({}, { each: true })
    @IsString({ each: true })
    readonly emails?: string[];

    @IsOptional()
    @IsEnum(reportFields, { each: true })
    @IsArray()
    @IsString({ each: true })
    readonly reportFields?: string[];

    @IsOptional()
    @Type(() => Number)
    @IsNumber()
    updatedAt?: number;
}

控制器:

@Put('reports/:id/schedule')
async updateScheduleData(
    @Param('id') id: string,
    @Body(new ValidationPipe()) updateData: updateScheduleDto,
) {
    return this.reportService.updateScheduleData(id, updateData);
}

服务:

 async updateScheduleData(id: string, updateData: updateScheduleDto) {
        try {
            updateData.updatedAt = this.utils.getCurrentTime();
            const newData = await this.reportScheduleModel.findByIdAndUpdate(
                id,
                updateData,
                {
                    new: true,
                },
            );

            console.log(`Data has been updated to ${newData}`);
            return newData;
        } catch (error) {
            throw new Error('>>>' + error);
        }
    }

但是验证无法通过密钥进行。如果我在 body 对象中传递了一个无效的键(如下所示),即使程序执行没有任何错误,我该如何解决这个问题?我错过了什么?

{
    "emaaaalls":["randomemail123@gmail.com"]
}

标签: mongodbtypescriptvalidationnestjsdto

解决方案


您需要将选项传递{ forbidUnknownValues: true }ValidationPipe. 当传入未知值时,这将class-validator引发错误。您可以阅读此处的选项


推荐阅读