typescript - Hvordan løfte feil på riktig måte fra Joi.alternatives?
Jeg har et felt som kan være en av mange typer. Hver type har et forskjellig skjema. Jeg prøvde å bruke Joi.alternatives for å validere forespørselens JSON. Imidlertid ønsker jeg å hente ut feilene fra de indre valideringsfunksjonene. For øyeblikket overstyrer alternatives det med sin egen feilmelding.
For eksempel har jeg et felt kalt customer som enten kan være en business eller en person. Hvis kunden er en person, er bare name-feltet til stede.
{
"customer": {
"name": "John Doe"
},
...
}
På den annen side, hvis kunden er en business, er både name og businessCode-feltene til stede.
{
"customer": {
"name": "My Company",
"businessCode": 1820
},
...
}
Jeg gjør validering som:
Joi.alternatives()
.match("one")
.try(
Joi.object<Person>({
name: Joi.string().required()
}).unknown(false).required(),
Joi.object<Business>({
name: Joi.string().required(),
businessCode: Joi.number().integer().positive().required()
}).unknown(false).required()
)
Jeg bruker match('one') for å spesifisere at enten business eller person skal matches, men ikke begge. Når jeg sender en ugyldig businessCode som {"businessCode": -999}, kaster Joi en feil
"customer" samsvarer ikke med noen av de tillatte typene
som ikke er like nyttig som å gi en melding som "forretningskoden er negativ, noe som ikke er tillatt som en virksomhet". Vi vet at dette er en virksomhet fordi en person ikke har noen forretningskoder. Hvordan kan jeg fjerne feilen fra de interne valideringene? Et annet alternativ jeg tenkte på er å gjøre validering to ganger, validere feltene etter at vi har validert feltets eksistens, men jeg er ikke sikker på hvordan jeg gjør dette innenfor Joi.
Svar #1
Dette er ikke mulig i siste versjon av Joi.
I ditt scenario sier du
«forretningskoden er negativ, noe som ikke er tillatt som en virksomhet»
men for å fastslå dette antyder du at det samsvarende alternativet her er «Business», når det i virkeligheten (og fra jois synspunkt) har inputen mislyktes i Business-skjemaet like mye som det mislyktes i Person-skjemaet.
For problemet med å rapportere spesifikke feil når man jobber med alternatives, er min løsning å manuelt kjøre inputen gjennom de forskjellige skjemaene og deretter lage et aggregert svar som ser omtrent slik ut: "denne inputen feilet skjema A fordi X mangler og feilet skjema B fordi Y mangler"