Sikre applikasjonene dine ved å validere data på forespørselsnivå ved å bruke Joi-valideringsbiblioteket.

Å godta uprøvde og uvaliderte data i en nettapplikasjon kan forårsake sikkerhetssårbarheter, og uforutsette problemer kan oppstå fra de ugyldige dataene.

Node.js ORMer, som Sequelize og TypeORM, lar deg sette valideringsregler ut av boksen på applikasjonsnivå. Under API-utvikling kommer data fra HTTP-forespørsler til spesifikke endepunkter. Dette skjer på forespørselsnivå; standardvalideringen som tilbys av ORMene gjelder derfor ikke for dem.

Joi er en skjemabeskrivelse og datavalidator for JavaScript. Her vil du lære hvordan du bruker Joi-valideringsbiblioteket til å validere data på forespørselsnivå.

Sette opp demoprosjekt

For å demonstrere hvordan Joi validerer data, vil du bygge en enkel demoapplikasjon som etterligner en faktisk applikasjon.

Opprett først en prosjektmappe og flytt inn i den ved å kjøre følgende kommando:

mkdir demoapp && cd demoapp

Deretter initialiser npm i prosjektkatalogen din ved å kjøre:

instagram viewer
npm init -y

Deretter må du installere noen avhengigheter. Avhengighetene som kreves for denne opplæringen inkluderer følgende:

  • Uttrykke: Express er et Node.js-rammeverk som gir et robust sett med funksjoner for nett- og mobilapplikasjoner. Express gjør det enklere å bygge backend-applikasjoner med Node.js.
  • Joi: Joi er et datavalideringsbibliotek for Node.js.

Installer avhengighetene med nodepakkebehandleren ved å kjøre kommandoen nedenfor:

npm installer express joi

Deretter oppretter du en index.js fil i rotkatalogen din og legg til følgende kodeblokk til den:

konst uttrykke = krever("uttrykke");
konst ruter = krever("./ruter");
konst port = 3000;

konst app = express();

app.use (express.json());
app.use (express.urlencoded({ forlenget: ekte }));
app.use (ruter);

app.listen (port, () => {
konsoll.Logg("appen lytter på port 3000!");
});

Kodeblokken ovenfor setter opp en enkel Express-server. Den konfigurerer mellomvare for å analysere innkommende forespørsler og håndtere innkommende forespørsler og starter serveren for å lytte etter innkommende forespørsler på port 3000.

Ruting og håndtering av forespørsler

For enkelhets skyld oppretter du en mellomvare for forespørselsbehandler som returnerer en statuskode, sammen med forespørselsteksten, som et svar på hver forespørsel som prøver å sende data til applikasjonen din.

Lage en handler.js fil i prosjektets rotkatalog og legg til kodeblokken nedenfor:

konst demoHandler = (req, res, neste) => {
res.send({
kode: 201,
data: req.body,
});
neste();
};

modul.exports = demoHandler;

Deretter oppretter du en router.js fil i prosjektets rotkatalog og legg til kodeblokken nedenfor i filen din:

konst uttrykke = krever("uttrykke");
konst demoHandler = krever("./handler");
konst ruter = ekspress. Ruter();

router.post("/melde deg på", demoHandler);

modul.exports = ruter;

Opprette et Joi-skjema

Et Joi-skjema representerer et spesifikt dataobjekts forventede struktur og valideringsregler.

For å lage et Joi-skjema kan du bruke Joi.object() metode og kjede ulike valideringsregler eksponert av Joi for å definere strukturen og valideringskravene for dataene dine.

For eksempel:

konst exampleSchema = Joi.object({
navn: Joi.string().min(3).required(),
});

Eksemplet ovenfor beskriver et enkelt Joi-skjema med en Navn eiendom. De Navn eiendom har en verdi på Joi.string().min (3).required(). Dette betyr at Navn verdien skal være en streng med en minimumslengde på 3 tegn, og den er påkrevd.

Ved å bruke Joi kan du lenke ulike metoder for å legge til flere valideringsbegrensninger til hvert felt som er definert i skjemaet ditt.

Her er et eksempel med flere felt og valideringsbegrensninger:

konst userSchema = Joi.object({
e-post: Joi.string().email().required(),

passord: Joi.string().min(6).required(),

alder: Joi.number().min(18).valgfri(),

ansatt: Joi.boolean().optional(),

telefon: Joi.string()
.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.required(),

adresse: Joi.object({
gate: Joi.string().min(3).required(),
by: Joi.string().min(3).required(),
tilstand: Joi.string().min(3).required(),
zip: Joi.number().min(3).required(),
}).required(),

 hobbyer: Joi.array().items (Joi.string()).required(),

}).options({ abortere Tidlig: falsk });

De userSchema definerer følgende begrensninger for hver egenskap:

  • e-post: Må være en gyldig e-poststreng.
  • passord: Må være en streng med minimum 6 tegn.
  • alder: Et valgfritt nummer med en minimumsverdi på 18.
  • ansatt: En valgfri boolsk.
  • telefon: En obligatorisk streng som samsvarer med den spesifiserte regex uttrykk (/^\d{3}-\d{3}-\d{4}$/).
  • adresse: Et objekt som representerer brukerens adresse med følgende underegenskaper.
    • gate: En obligatorisk streng med en minimumslengde på 3 tegn.
    • by: En obligatorisk streng med en minimumslengde på 3 tegn.
    • stat: En obligatorisk streng med en minimumslengde på 3 tegn.
    • glidelås: Et nødvendig tall med en minimumsverdi på 3.
  • hobbyer: En nødvendig rekke strenger.

I tillegg til begrensningene, userSchema setter abortere Tidlig mulighet til falsk. Som standard stopper Joi kjøringen av programmet så snart det støter på den første feilen og skriver ut feilen til konsollen. Sett imidlertid dette alternativet til falsk sørger for at Joi sjekker hele skjemaet og skriver ut alle de oppståtte feilene til konsollen.

Validerer data med Joi

Lage en validation.js fil og legg til userSchema kode til den.

Som så:

//validation.js
konst Joi = krever("joi");

konst userSchema = Joi.object({
//...
}).options({ abortere Tidlig: falsk });

modul.exports = brukerskjema;

Deretter oppretter du en mellomvare som fanger opp forespørselsnyttelaster og verifiserer dem mot et gitt skjema ved å legge til følgende kode under userSchema kode.

konst valideringMellvare = (skjema) => {
komme tilbake(req, res, neste) => {
konst { error } = schema.validate (req.body);

hvis (feil) {
// Håndter valideringsfeil
konsoll.log (feil.melding);

res.status(400).json({ feil: feilmeldingsdetaljer });
} ellers {
// Data er gyldige, fortsett til neste mellomvare
neste();
}
};
};

Når en forespørsel gjøres, påkaller mellomvaren validere metoden for skjema for å validere forespørselsorganet. Hvis det oppstår valideringsfeil, sender mellomvaren en 400 Ugyldig forespørsel svar med feilmeldingene hentet fra valideringsfeildetaljene.

På den annen side, hvis valideringen går uten feil, kaller mellomvaren opp neste() funksjon.

Til slutt eksporterer du validering mellomvare og userSchema.

modul.exports = {
brukerskjema,
validering mellomvare,
};

Testing av valideringsbegrensninger

Import validering mellomvare og userSchema inn i din router.js fil og sett opp mellomvaren slik:

konst { validationMiddleware, userSchema } = krever("./validering");

router.post("/melde deg på", validationMiddleware (userSchema), demoHandler);

Start applikasjonen ved å kjøre kommandoen nedenfor:

nodeindeks.js

Send deretter en HTTP POST-forespørsel til lokalvert: 3000/registrering ved å bruke testdataene nedenfor. Du kan oppnå dette ved å bruke cURL eller en annen API-klient.

{
"e-post": "bruker@eksempel", // Ugyldig e-postformat
"passord": "sende", // Passordlengde mindre enn 6 tegn
"alder": 15, // Alder under 18
"ansatt": ekte,
"hobbyer": ["lesning", "løping"],
"telefon": "123-456-789", // Ugyldig telefonnummerformat
"adresse": {
"gate": "123",
"by": "Eksempel by",
"stat": "Eksempelstat",
"glidelås": 12345
}
}

Denne forespørselen vil mislykkes og returnere et feilobjekt da nyttelasten inneholder mange ugyldige felt, for eksempel e-post, passord, alder og telefon. Ved å bruke det oppgitte feilobjektet kan du håndtere feilene passende.

Forenkle datavalidering med Joi

Her dekket du det meste av det grunnleggende om datavalidering ved hjelp av Joi. Du kan imidlertid dekke mer avanserte teknikker og begrensninger i Joi-dokumentasjonen.

Joi forenkler datavalideringsoppgaven i JavaScript, og gir en intuitiv løsning som betydelig forbedrer påliteligheten og integriteten til data som er lagret i applikasjonen din.