javascript - klassevalidator stopper på første fungerer ikke som angitt i dokumentasjonen
Jeg har en Dto-klasse som jeg bruker for validering. Jeg har en global Validation Pipe med egenskapen stopAtFirstError satt til true. Når jeg kjører koden, blir valideringsdekoratører utført selv etter at den første dekoratøren returnerer en feilmelding.
Nest.js Main.ts-fil
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
stopAtFirstError: true
}),
);
Dto-klasse brukt til validering.
export class LeaveApplicationBodyDto {
@ValidateIf((o) => regualarLeaves.includes(o.type))
@IsRequired()
@IsUniqueDate()
@ValidateNested({ each: true })
@Type(() => LeaveMetadata)
metadata: LeaveMetadata[];
@IsString()
@IsIn([...regualarLeaves, ...specialLeaves])
type: string;
@ValidateIf((o) => specialLeaves.includes(o.type))
@IsYYYYMMDDFormat()
@IsString()
@IsNotHoliday()
startDate: String;
@IsString()
remark: string;
}
Her @IsRequired() og @IsuniqueDate() er egendefinerte dekoratører laget for valideringsformål. IsRequired returnerer false hvis metadata-egenskapen ikke blir sendt gjennom POST-forespørselskroppen. Etter at IsRequired() returnerer false, går koden videre til IsUnique() som sjekker et array av objektet gjennom .map()-metoden levert av JS. På grunn av mangel på tidlig terminering av koden blir det kastet en feil cannot read property of undefined.
Spørsmålet er hvorfor StopAtFirstError:true ikke fungerer som forventet, eller om jeg overser noe.
Svar #1
stopAtFirstError fungerer når du har dekoratorsrekkefølgen riktig for å oppnå ønsket resultat. Generelt fungerer dekoratorer i motsatt rekkefølge.
For eksempel:
@A()
@B()
function test() {}
dette vil bli evaluert til
A(B(test()))
Så mer innerst (nærmere) til funksjonen vil bli utført først og omvendt.
Les mer i de offisielle Typescript-dokumentene
