Zavarujte svoje aplikacije s preverjanjem podatkov na ravni zahteve s knjižnico za preverjanje veljavnosti Joi.

Sprejemanje nepreverjenih in nepreverjenih podatkov v spletno aplikacijo lahko povzroči varnostne ranljivosti, zaradi neveljavnih podatkov pa lahko nastanejo nepredvidene težave.

ORM-ji Node.js, kot sta Sequelize in TypeORM, vam omogočajo, da pravilno nastavite pravila preverjanja na ravni aplikacije. Med razvojem API-ja prihajajo podatki iz zahtev HTTP do določenih končnih točk. To se zgodi na ravni zahteve; zato privzeta validacija, ki jo ponujajo ORM-ji, zanje ne velja.

Joi je opis sheme in validator podatkov za JavaScript. Tukaj se boste naučili, kako uporabljati validacijsko knjižnico Joi za preverjanje podatkov na ravni zahteve.

Nastavitev predstavitvenega projekta

Da pokažem, kako Joi potrdi podatke, boste zgradili preprosto predstavitveno aplikacijo, ki posnema dejansko aplikacijo.

Najprej ustvarite mapo projekta in se premaknite vanjo tako, da zaženete naslednji ukaz:

mkdir demoapp && cd demoapp
instagram viewer

Nato inicializirajte npm v imeniku vašega projekta tako, da zaženete:

npm init -y

Nato boste morali namestiti nekaj odvisnosti. Odvisnosti, potrebne za to vadnico, vključujejo naslednje:

  • Express: Express je ogrodje Node.js ki zagotavlja robusten nabor funkcij za spletne in mobilne aplikacije. Express olajša gradnjo zalednih aplikacij z Node.js.
  • Joi: Joi je knjižnica za preverjanje podatkov za Node.js.

Namestite odvisnosti z upravljalnik paketov vozlišča tako, da zaženete spodnji ukaz:

npm namestite hitri joi

Nato ustvarite index.js datoteko v vašem korenskem imeniku in ji dodajte naslednji blok kode:

konst izraziti = zahtevati("ekspresno");
konst usmerjevalnik = zahtevati("./routes");
konst pristanišče = 3000;

konst app = express();

app.use (express.json());
app.use (express.urlencoded({ podaljšan: prav }));
app.use (usmerjevalnik);

app.listen (vrata, () => {
konzola.log("aplikacija posluša na vratih 3000!");
});

Zgornji blok kode nastavi preprost strežnik Express. Konfigurira vmesno programsko opremo za razčlenjevanje podatkov o dohodnih zahtevah in obravnavanje dohodnih zahtev ter zažene strežnik, da posluša dohodne zahteve na vratih 3000.

Usmerjanje in obravnavanje zahtev

Zaradi poenostavitve boste ustvarili vmesno programsko opremo za obravnavo zahtev, ki vrne statusno kodo skupaj s telesom zahteve kot odgovor na vsako zahtevo, ki poskuša poslati podatke vaši aplikaciji.

Ustvariti handler.js datoteko v korenskem imeniku vašega projekta in dodajte spodnji blok kode:

konst demoHandler = (req, res, next) => {
res.send({
Koda: 201,
podatki: req.body,
});
Naslednji();
};

modul.exports = demoHandler;

Nato ustvarite a router.js datoteko v korenskem imeniku vašega projekta in svoji datoteki dodajte spodnji blok kode:

konst izraziti = zahtevati("ekspresno");
konst demoHandler = zahtevati("./obravnavalec");
konst usmerjevalnik = express. Usmerjevalnik();

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

modul.exports = usmerjevalnik;

Ustvarjanje sheme Joi

Shema Joi predstavlja pričakovano strukturo in pravila preverjanja določenega podatkovnega objekta.

Če želite ustvariti shemo Joi, lahko uporabite Joi.objekt() metoda in veriga različnih pravil za preverjanje veljavnosti, ki jih je izpostavil Joi, da bi definiral strukturo in zahteve za preverjanje veljavnosti za vaše podatke.

Na primer:

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

Zgornji primer opisuje preprosto shemo Joi z a ime premoženje. The ime nepremičnina ima vrednost Joi.string().min (3).required(). To pomeni, da je ime vrednost mora biti niz z najmanjšo dolžino 3 znakov in je obvezna.

Z uporabo Joi lahko povežete različne metode, da dodate več omejitev preverjanja v vsako polje, definirano v vaši shemi.

Tu je primer z več polji in omejitvami preverjanja:

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

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

starost: Joi.number().min(18).neobvezno(),

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

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

naslov: Joi.object({
ulica: Joi.string().min(3).required(),
mesto: Joi.string().min(3).required(),
stanje: Joi.string().min(3).required(),
zip: Joi.number().min(3).required(),
}).potrebno(),

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

}).opcije({ abortEarly: lažno });

The userSchema določa naslednje omejitve za vsako lastnost:

  • E-naslov: mora biti veljaven e-poštni niz.
  • geslo: mora biti niz z najmanj 6 znaki.
  • starost: neobvezna številka z najmanjšo vrednostjo 18.
  • zaposlena: neobvezna logična vrednost.
  • telefon: Zahtevan niz, ki se ujema s podanim izraz regularnega izraza (/^\d{3}-\d{3}-\d{4}$/).
  • naslov: Objekt, ki predstavlja naslov uporabnika z naslednjimi podlastnostmi.
    • ulica: Zahtevan niz z najmanjšo dolžino 3 znakov.
    • mesto: Zahtevan niz z najmanjšo dolžino 3 znakov.
    • država: Zahtevan niz z najmanjšo dolžino 3 znakov.
    • zip: zahtevano število z najmanjšo vrednostjo 3.
  • hobiji: zahtevana matrika nizov.

Poleg omejitev, userSchema nastavi abortEarly možnost za lažno. Joi privzeto ustavi izvajanje programa takoj, ko naleti na prvo napako in napako natisne na konzolo. Vendar pa nastavitev te možnosti na lažno zagotavlja, da Joi preveri celotno shemo in natisne vse odkrite napake na konzolo.

Preverjanje podatkov z Joi

Ustvariti validacija.js datoteko in dodajte userSchema kodo zanj.

takole:

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

konst userSchema = Joi.object({
//...
}).opcije({ abortEarly: lažno });

modul.exports = uporabniška shema;

Nato ustvarite vmesno programsko opremo, ki prestreže koristne obremenitve zahtev in jih preveri glede na podano shemo, tako da pod userSchema Koda.

konst validacijaMiddleware = (shema) => {
vrnitev(req, res, next) => {
konst {napaka} = schema.validate (req.body);

če (napaka) {
// Obravnava napako pri preverjanju
konzola.log (sporočilo o napaki);

res.status(400).json({ napake: error.details });
} drugače {
// Podatki so veljavni, nadaljujte z naslednjo vmesno programsko opremo
Naslednji();
}
};
};

Ko je podana zahteva, vmesna programska oprema prikliče potrditi metoda shema za potrditev telesa zahteve. Če pride do napak pri preverjanju, vmesna programska oprema pošlje a 400 Slaba zahteva odgovor s sporočili o napakah, pridobljenimi iz podrobnosti o napaki pri preverjanju.

Po drugi strani pa, če preverjanje poteka brez napak, vmesna programska oprema pokliče Naslednji() funkcijo.

Končno izvozite validationMiddleware in userSchema.

modul.exports = {
userSchema,
validacija vmesne programske opreme,
};

Testiranje omejitev preverjanja veljavnosti

Uvozi validationMiddleware in userSchema v tvoje router.js datoteko in nastavite vmesno programsko opremo tako:

konst { validationMiddleware, userSchema } = zahtevati("./preverjanje");

router.post("/prijava", validationMiddleware (userSchema), demoHandler);

Zaženite aplikacijo tako, da zaženete spodnji ukaz:

vozliščekazalo.js

Nato naredite zahtevo HTTP POST za lokalni gostitelj: 3000/prijavo z uporabo spodnjih testnih podatkov. To lahko dosežete z uporabo cURL ali katerega koli drugega API odjemalca.

{
"E-naslov": "uporabnik@primer", // Neveljavna oblika elektronske pošte
"geslo": "mimo", // Dolžina gesla je manjša od 6 znakov
"starost": 15, // Starost pod 18 let
"zaposlen": prav,
"hobiji": ["branje", "tek"],
"telefon": "123-456-789", // Neveljavna oblika telefonske številke
"naslov": {
"ulica": "123",
"mesto": "Zgledno mesto",
"država": "Primer države",
"zip": 12345
}
}

Ta zahteva ne bi uspela in bi vrnila objekt napake, saj vsebina vsebuje veliko neveljavnih polj, kot so e-pošta, geslo, starost in telefon. Z uporabo podanega objekta napake lahko obravnavati napake ustrezno.

Poenostavitev preverjanja podatkov z Joi

Tukaj ste zajeli večino osnov potrjevanja podatkov z uporabo Joi. Vendar pa lahko naprednejše tehnike in omejitve obravnavate v dokumentaciji Joi.

Joi poenostavlja nalogo preverjanja veljavnosti podatkov v JavaScriptu in zagotavlja intuitivno rešitev, ki bistveno izboljša zanesljivost in celovitost podatkov, shranjenih v vaši aplikaciji.