Sikre dine applikationer ved at validere data på anmodningsniveau ved hjælp af Joi-valideringsbiblioteket.
Accept af utestede og uvaliderede data i en webapplikation kan forårsage sikkerhedssårbarheder, og uforudsete problemer kan opstå fra de ugyldige data.
Node.js ORM'er, såsom Sequelize og TypeORM, giver dig mulighed for at sætte valideringsregler ud af boksen på applikationsniveau. Under API-udvikling kommer data fra HTTP-anmodninger til specifikke slutpunkter. Dette sker på anmodningsniveau; derfor gælder den standardvalidering, som ORM'erne tilbyder, ikke for dem.
Joi er en skemabeskrivelse og datavalidator til JavaScript. Her lærer du, hvordan du bruger Joi-valideringsbiblioteket til at validere data på anmodningsniveau.
Opsætning af demoprojekt
For at demonstrere hvordan Joi validerer data, vil du bygge en simpel demoapplikation, der efterligner en faktisk applikation.
Først skal du oprette en projektmappe og flytte ind i den ved at køre følgende kommando:
mkdir demoapp && cd demoapp
Start derefter npm i din projektmappe ved at køre:
npm init -y
Dernæst skal du installere nogle afhængigheder. De afhængigheder, der kræves til denne øvelse, omfatter følgende:
- Express: Express er en Node.js-ramme der giver et robust sæt funktioner til web- og mobilapplikationer. Express gør det nemmere at bygge backend-applikationer med Node.js.
- Joi: Joi er et datavalideringsbibliotek for Node.js.
Installer afhængighederne med nodepakkehåndteringen ved at køre kommandoen nedenfor:
npm installer express joi
Opret derefter en index.js fil i din rodmappe og tilføj følgende kodeblok til den:
konst udtrykke = kræve("udtrykke");
konst router = kræve("./ruter");
konst port = 3000;konst app = express();
app.use (express.json());
app.use (express.urlencoded({ udvidet: rigtigt }));
app.use (router);
app.listen (port, () => {
konsol.log("app lytter på port 3000!");
});
Kodeblokken ovenfor sætter en simpel Express-server op. Den konfigurerer middleware til at parse indgående anmodningsdata og håndtere indgående anmodninger og starter serveren til at lytte efter indgående anmodninger på port 3000.
Routing og håndtering af anmodninger
For nemheds skyld vil du oprette en forespørgselsbehandler-middleware, der returnerer en statuskode sammen med forespørgselsteksten som et svar på hver anmodning, der forsøger at sende data til din applikation.
Lave en handler.js fil i dit projekts rodmappe og tilføj kodeblokken nedenfor:
konst demoHandler = (kræve, res, næste) => {
res.send({
kode: 201,
data: req.body,
});
Næste();
};
modul.exports = demoHandler;
Opret derefter en router.js fil i dit projekts rodmappe og tilføj kodeblokken nedenfor til din fil:
konst udtrykke = kræve("udtrykke");
konst demoHandler = kræve("./handler");
konst router = ekspres. Router();router.post("/Tilmelde", demoHandler);
modul.exports = router;
Oprettelse af et Joi-skema
Et Joi-skema repræsenterer et specifikt dataobjekts forventede struktur og valideringsregler.
For at oprette et Joi-skema kan du bruge Joi.object() metode og kæde forskellige valideringsregler afsløret af Joi for at definere strukturen og valideringskravene til dine data.
For eksempel:
konst eksempelSchema = Joi.object({
navn: Joi.string().min(3).påkrævet(),
});
Eksemplet ovenfor beskriver et simpelt Joi-skema med en navn ejendom. Det navn ejendom har en værdi på Joi.string().min (3).required(). Det betyder, at navn værdien skal være en streng med en minimumlængde på 3 tegn, og den er påkrævet.
Ved at bruge Joi kan du sammenkæde forskellige metoder for at tilføje flere valideringsbegrænsninger til hvert felt, der er defineret i dit skema.
Her er et eksempel med flere felter og valideringsbegrænsninger:
konst userSchema = Joi.object({
email: Joi.string().email().required(),adgangskode: Joi.string().min(6).påkrævet(),
alder: Joi.number().min(18).valgfri(),
ansat: Joi.boolean().valgfri(),
telefon: Joi.string()
.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.required(),adresse: Joi.object({
gade: Joi.string().min(3).påkrævet(),
by: Joi.string().min(3).påkrævet(),
tilstand: Joi.string().min(3).påkrævet(),
zip: Joi.number().min(3).påkrævet(),
}).required(),hobbyer: Joi.array().items (Joi.string()).required(),
}).muligheder({ afbryde Tidligt: falsk });
Det brugerSchema definerer følgende begrænsninger for hver egenskab:
- e-mail: Skal være en gyldig e-mail-streng.
- adgangskode: Skal være en streng med minimum 6 tegn.
- alder: Et valgfrit tal med en minimumsværdi på 18.
- ansat: En valgfri boolean.
- telefon: En påkrævet streng, der matcher den angivne regex udtryk (/^\d{3}-\d{3}-\d{4}$/).
-
adresse: Et objekt, der repræsenterer brugerens adresse med følgende underegenskaber.
- gade: En påkrævet streng med en minimumlængde på 3 tegn.
- by: En påkrævet streng med en minimumlængde på 3 tegn.
- stat: En påkrævet streng med en minimumlængde på 3 tegn.
- lynlås: Et påkrævet tal med en minimumsværdi på 3.
- hobbyer: En påkrævet række af strenge.
Ud over begrænsningerne, brugerSchema indstiller afbryde Tidligt mulighed for at falsk. Som standard stopper Joi udførelsen af programmet, så snart det støder på den første fejl og udskriver fejlen til konsollen. Indstil dog denne mulighed til falsk sikrer, at Joi tjekker hele skemaet og udskriver alle de stødte fejl til konsollen.
Validering af data med Joi
Lave en validation.js fil og tilføj brugerSchema kode til det.
Ligesom:
//validation.js
konst Joi = kræve("joi");konst userSchema = Joi.object({
//...
}).muligheder({ afbryde Tidligt: falsk });
modul.exports = brugerskema;
Opret derefter en middleware, der opsnapper forespørgselsnyttelast og verificerer dem mod et givet skema ved at tilføje følgende kode under brugerSchema kode.
konst valideringMiddleware = (skema) => {
Vend tilbage(kræve, res, næste) => {
konst { error } = schema.validate (req.body);hvis (fejl) {
// Håndter valideringsfejl
konsol.log (fejl.meddelelse);
res.status(400).json({ fejl: error.details });
} andet {
// Data er gyldige, fortsæt til næste middleware
Næste();
}
};
};
Når der fremsættes en anmodning, kalder middlewaren på validere metoden til skema for at validere anmodningsorganet. Hvis der opstår valideringsfejl, sender middlewaren en 400 Dårlig anmodning svar med fejlmeddelelserne udtrukket fra valideringsfejldetaljerne.
På den anden side, hvis valideringen forløber uden fejl, kalder middlewaren Næste() fungere.
Til sidst eksporterer du validering Middleware og brugerSchema.
modul.exports = {
brugerskema,
validering Middleware,
};
Test af valideringsbegrænsninger
Importere validering Middleware og brugerSchema ind i din router.js fil og opsæt middlewaren sådan:
konst { validationMiddleware, userSchema } = kræve("./validering");
router.post("/Tilmelde", validationMiddleware (userSchema), demoHandler);
Start din applikation ved at køre kommandoen nedenfor:
nodeindeks.js
Lav derefter en HTTP POST-anmodning til localhost: 3000/tilmelding ved hjælp af testdataene nedenfor. Du kan opnå dette ved at bruge cURL eller enhver anden API-klient.
{
"e-mail": "bruger@eksempel", // Ugyldigt e-mail-format
"adgangskode": "passere", // Adgangskodelængde mindre end 6 tegn
"alder": 15, // Alder under 18
"ansat": rigtigt,
"hobbyer": ["læsning", "løber"],
"telefon": "123-456-789", // Ugyldigt telefonnummerformat
"adresse": {
"gade": "123",
"by": "Eksempel by",
"stat": "Eksempeltilstand",
"zip": 12345
}
}
Denne anmodning ville mislykkes og returnere et fejlobjekt, da nyttelasten indeholder en masse ugyldige felter, såsom e-mail, adgangskode, alder og telefon. Ved at bruge det medfølgende fejlobjekt kan du håndtere fejlene passende.
Forenkling af datavalidering med Joi
Her dækkede du det meste af det grundlæggende i datavalidering ved hjælp af Joi. Du kan dog dække mere avancerede teknikker og begrænsninger i Joi-dokumentationen.
Joi forenkler datavalideringsopgaven i JavaScript og giver en intuitiv løsning, der markant forbedrer pålideligheden og integriteten af data, der er gemt i din applikation.