Apsaugokite savo programas patvirtindami duomenis užklausos lygiu naudodami Joi patvirtinimo biblioteką.

Neišbandytų ir nepatvirtintų duomenų priėmimas į žiniatinklio programą gali sukelti saugumo spragas, o dėl netinkamų duomenų gali kilti nenumatytų problemų.

Node.js ORM, pvz., Sequelize ir TypeORM, leidžia iš karto nustatyti patvirtinimo taisykles programos lygiu. Kuriant API, duomenys gaunami iš HTTP užklausų į konkrečius galutinius taškus. Tai vyksta užklausos lygiu; taigi, numatytasis ORM siūlomas patvirtinimas jiems netaikomas.

Joi yra „JavaScript“ schemos aprašas ir duomenų tikrintuvas. Čia sužinosite, kaip naudoti Joi patvirtinimo biblioteką duomenims patvirtinti užklausos lygiu.

Demonstracinio projekto nustatymas

Norėdami parodyti, kaip Joi patvirtina duomenis, sukursite paprastą demonstracinę programą, kuri imituoja tikrąją programą.

Pirmiausia sukurkite projekto aplanką ir perkelkite į jį vykdydami šią komandą:

mkdir demoapp && cd demoapp

Tada inicijuokite npm savo projekto kataloge vykdydami:

instagram viewer
npm init -y

Tada turėsite įdiegti kai kurias priklausomybes. Priklausomybės, reikalingos šiai mokymo programai, yra šios:

  • Express: Express yra Node.js sistema kuri suteikia tvirtą funkcijų rinkinį žiniatinklio ir mobiliosioms programoms. „Express“ leidžia lengviau kurti pagrindines programas naudojant „Node.js“.
  • Joi: Joi yra duomenų patvirtinimo biblioteka, skirta Node.js.

Įdiekite priklausomybes su mazgo paketų tvarkyklė paleisdami žemiau esančią komandą:

npm install express joi

Tada sukurkite an index.js failą savo šakniniame kataloge ir pridėkite prie jo šį kodo bloką:

konst išreikšti = reikalauti("išreikšti");
konst maršrutizatorius = reikalauti("./routes");
konst prievadas = 3000;

konst programa = express ();

app.use (express.json());
app.use (express.urlencoded({ pratęstas: tiesa }));
app.use (maršrutizatorius);

app.listen (port, () => {
konsolė.log("Programa klausosi 3000 prievado!");
});

Aukščiau pateiktas kodo blokas nustato paprastą Express serverį. Jis sukonfigūruoja tarpinę programinę įrangą, kad išanalizuoti gaunamų užklausų duomenis ir apdorotų gaunamas užklausas, ir paleidžia serverį klausytis gaunamų užklausų per 3000 prievadą.

Maršruto parinkimo ir tvarkymo užklausos

Kad būtų paprasčiau, sukursite užklausų tvarkyklės tarpinę programinę įrangą, kuri grąžins būsenos kodą kartu su užklausos turiniu kaip atsaką į kiekvieną užklausą, bandančią siųsti duomenis į jūsų programą.

Sukurti handler.js failą į savo projekto šakninį katalogą ir toliau pridėkite kodo bloką:

konst demoHandler = (req, res, next) => {
res.send({
kodas: 201,
duomenys: req.body,
});
Kitas();
};

modulis.exports = demoHandler;

Tada sukurkite a maršrutizatorius.js failą savo projekto šakniniame kataloge ir prie failo pridėkite toliau pateiktą kodo bloką:

konst išreikšti = reikalauti("išreikšti");
konst demoHandler = reikalauti("./tvarkytojas");
konst maršrutizatorius = greitasis. Maršrutizatorius ();

router.post("/Registruotis", demoHandler);

modulis.exports = maršrutizatorius;

Joi schemos kūrimas

Joi schema reiškia konkretaus duomenų objekto numatomą struktūrą ir patvirtinimo taisykles.

Norėdami sukurti Joi schemą, galite naudoti Joi.object() metodas ir grandinės įvairios patvirtinimo taisyklės, kurias paskelbė Joi, kad nustatytų jūsų duomenų struktūrą ir patvirtinimo reikalavimus.

Pavyzdžiui:

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

Aukščiau pateiktame pavyzdyje aprašoma paprasta Joi schema su a vardas nuosavybė. The vardas turtas turi vertę Joi.string().min (3).required(). Tai reiškia, kad vardas reikšmė turi būti eilutė, kurios ilgis yra ne mažesnis kaip 3 simboliai, ir ji būtina.

Naudodami Joi galite sujungti įvairius metodus, kad pridėtumėte daugiau patvirtinimo apribojimų kiekvienam jūsų schemoje apibrėžtam laukui.

Štai pavyzdys su daugiau laukų ir patvirtinimo apribojimų:

konst userSchema = Joi.object({
paštas: Joi.string().email().required(),

slaptažodis: Joi.string().min(6).required (),

amžius: Joi.skaičius().min(18).neprivaloma (),

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

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

adresas: Joi.object({
gatvė: Joi.string().min(3).required (),
miestas: Joi.string().min(3).required (),
būsena: Joi.string().min(3).required (),
zip: Joi.number().min(3).required (),
}).required(),

 pomėgiai: Joi.masyvas().elementai (Joi.string()).required(),

}).galimybės({ nutraukti anksti: klaidinga });

The naudotojo schema apibrėžia šiuos kiekvienos nuosavybės apribojimus:

  • paštu: turi būti tinkama el. pašto eilutė.
  • Slaptažodis: turi būti mažiausiai 6 simbolių eilutė.
  • amžiaus: pasirenkamas skaičius, kurio minimali reikšmė yra 18.
  • įdarbintas: pasirenkama loginė vertė.
  • telefonas: būtina eilutė, atitinkanti nurodytą regex išraiška (/^\d{3}-\d{3}-\d{4}$/).
  • adresu: objektas, vaizduojantis vartotojo adresą su šiomis antrinėmis savybėmis.
    • gatve: būtina eilutė, kurios ilgis yra mažiausiai 3 simboliai.
    • miestas: būtina eilutė, kurios ilgis yra mažiausiai 3 simboliai.
    • valstybė: būtina eilutė, kurios ilgis yra mažiausiai 3 simboliai.
    • užtrauktukas: būtinas skaičius, kurio mažiausia reikšmė yra 3.
  • pomėgiai: būtinas eilučių masyvas.

Be suvaržymų, naudotojo schema nustato nutraukti anksti galimybė į klaidinga. Pagal numatytuosius nustatymus Joi sustabdo programos vykdymą, kai tik susiduria su pirmąja klaida, ir išspausdina klaidą konsolėje. Tačiau nustatykite šią parinktį į klaidinga užtikrina, kad Joi patikrintų visą schemą ir išspausdintų visas aptiktas klaidas į konsolę.

Duomenų patvirtinimas naudojant Joi

Sukurti patvirtinimas.js failą ir pridėkite naudotojo schema kodą į jį.

Kaip taip:

//validation.js
konst Joi = reikalauti("labai");

konst userSchema = Joi.object({
//...
}).galimybės({ nutraukti anksti: klaidinga });

modulis.exports = userSchema;

Tada sukurkite tarpinę programinę įrangą, kuri perima užklausų naudinguosius krovinius ir patikrina juos pagal pateiktą schemą, pridėdami šį kodą po naudotojo schema kodas.

konst validationMiddleware = (schema) => {
grąžinti(req, res, next) => {
konst { error } = schema.validate (req.body);

jeigu (klaida) {
// Tvarkyti patvirtinimo klaidą
konsolė.log (error.message);

res.status(400.json({ klaidų: Klaidos detalės });
} Kitas {
// Duomenys galioja, pereikite prie kitos tarpinės programinės įrangos
Kitas();
}
};
};

Kai pateikiama užklausa, tarpinė programinė įranga iškviečia patvirtinti metodas schema prašymo įstaigai patvirtinti. Jei įvyksta patvirtinimo klaidų, tarpinė programinė įranga siunčia a 400 bloga užklausa atsakymas su klaidos pranešimais, gautais iš patvirtinimo klaidos informacijos.

Kita vertus, jei patvirtinimas praeina be klaidų, tarpinė programinė įranga iškviečia Kitas() funkcija.

Galiausiai eksportuokite patvirtinimas tarpinė programinė įranga ir naudotojo schema.

modulis.exports = {
vartotojo schema,
patvirtinimas tarpinė programinė įranga,
};

Tikrinimo patvirtinimo apribojimai

Importuoti patvirtinimas tarpinė programinė įranga ir naudotojo schema į tavo maršrutizatorius.js failą ir nustatykite tarpinę programinę įrangą taip:

konst { validationMiddleware, userSchema } = reikalauti("./validation");

router.post("/Registruotis", patvirtinimas Vidurinė programinė įranga (userSchema), demoHandler);

Paleiskite programą vykdydami toliau pateiktą komandą:

mazgasindeksas.js

Tada pateikite HTTP POST užklausą localhost: 3000 / registracija naudojant toliau pateiktus bandymo duomenis. Tai galite pasiekti naudodami cURL arba bet kurį kitą API klientą.

{
"el. paštas": "naudotojas@pavyzdys", // Neteisingas el. pašto formatas
"Slaptažodis": "praleisti", // Slaptažodžio ilgis mažesnis nei 6 simboliai
"amžius": 15, // Amžius iki 18 metų
"įdarbintas": tiesa,
"hobis": ["skaitymas", "bėgimas"],
"telefonas": "123-456-789", // Neteisingas telefono numerio formatas
"adresas": {
"gatvė": "123",
"miestas": "Pavyzdinis miestas",
"valstybė": "Pavyzdinė valstybė",
"užtrauktukas": 12345
}
}

Ši užklausa nepavyks ir grąžins klaidos objektą, nes naudingajame krovinyje yra daug neteisingų laukų, pvz., el. pašto adresas, slaptažodis, amžius ir telefonas. Naudodami pateiktą klaidos objektą galite tvarkyti klaidas tinkamai.

Duomenų patvirtinimo supaprastinimas naudojant Joi

Čia apžvelgėte daugumą duomenų patvirtinimo naudojant Joi pagrindų. Tačiau pažangesnius metodus ir apribojimus galite aprašyti Joi dokumentacijoje.

Joi supaprastina duomenų tikrinimo užduotį JavaScript, suteikdama intuityvų sprendimą, kuris žymiai pagerina jūsų programoje saugomų duomenų patikimumą ir vientisumą.