Sådan gør du validering af input enkelt og rent i din Express.js-app

Denne tutorial kræver forudgående viden om brugen af ​​expressjs-rammen

Hvorfor har vi brug for validering af serversiden?

  • Validering af din klientside er ikke nok, og den kan undergraves
  • Mere tilbøjelige til Man i mellemangreb, og serveren bør aldrig stole på klientsiden
  • En bruger kan deaktivere JavaScript-validering på klientsiden og manipulere dataene

Hvis du har opbygget webapplikationer ved hjælp af en Express-ramme eller andre Node.js-rammer, spiller validering en afgørende rolle i enhver webapp, der kræver, at du validerer anmodningen bodyparamquery.

At skrive din egen middleware-funktion kan være besværlig, hvis

  • du vil bevæge dig hurtigt, samtidig med at du opretholder kvaliteten af ​​koden eller
  • du vil undgå at bruge eller i din hovedcontroller-funktion, hvor du definerer forretningslogikif (req.body.head)if (req.params.isCool)

I denne vejledning lærer du, hvordan du validerer input i en Express.js-app ved hjælp af et open source og populært modul kaldet express-validator.

Introduktion til ekspresvalidator

Definitionen på Github siger:

express-validator er et sæt express.js-mellemværker, der omslutter validator.js-validerings- og desinfektionsfunktioner.

Modulet implementerer fem vigtige API'er:

  • Tjek API
  • Filter API
  • Sanitization chain API
  • Valideringskæde API
  • Valideringsresultat API

Lad os se på en grundlæggende bruger routeuden noget valideringsmodul til at oprette en bruger:/route/user.js

/** * @api {post} /api/user Create user * @apiName Create new user * @apiPermission admin * @apiGroup User * * @apiParam {String} [userName] username * @apiParam {String} [email] Email * @apiParam {String} [phone] Phone number * @apiParam {String} [status] Status * * @apiSuccess (200) {Object} mixed `User` object */ router.post('/', userController.createUser)

Nu i brugercontroller /controllers/user.js

const User = require('./models/user') exports.createUser = (req, res, next) => { /** Here you need to validate user input. Let's say only Name and email are required field */ const { userName, email, phone, status } = req.body if (userName && email && isValidEmail(email)) { // isValidEmail is some custom email function to validate email which you might need write on your own or use npm module User.create({ userName, email, phone, status, }) .then(user => res.json(user)) .catch(next) } }

Ovenstående kode er kun et grundlæggende eksempel på validering af felter alene.

Du kan håndtere nogle valideringer i din brugermodel ved hjælp af Mongoose. For bedste praksis ønsker vi at sikre, at validering sker før forretningslogik.

express-validator tager sig også af alle disse valideringer og desinficering af input.

Installation

npm install --save express-validator

Inkluder modul i din hovedfil server.js:

const express = require('express') const bodyParser = require('body-parser') const expressValidator = require('express-validator') const app = express() const router = express.Router() app.use(bodyParser.json()) app.use(expressValidator()) app.use('/api', router)

Brug nu ekspresvalidator, din /routes/user.jsvil være sådan:

router.post( '/', userController.validate('createUser'), userController.createUser, )

Her userController.validateer en middleware-funktion, som forklares nedenfor. Det accepterer det methodnavn, som valideringen skal bruges til.

Lad os oprette en middleware-funktion validate()i vores /controllers/user.js:

const { body } = require('express-validator/check') exports.validate = (method) => { switch (method) { case 'createUser': { return [ body('userName', 'userName doesn't exists').exists(), body('email', 'Invalid email').exists().isEmail(), body('phone').optional().isInt(), body('status').optional().isIn(['enabled', 'disabled']) ] } } }

Se denne artikel for at vide mere om funktionsdefinition og dens anvendelse.

Den bodyfunktion vil kun validere req.bodyog tager to argumenter. Først er det property name. For det andet er din brugerdefinerede message, der vises, hvis validering mislykkes. Hvis du ikke angiver en brugerdefineret meddelelse, bruges standardmeddelelsen.

Som du kan se, requiredbruger vi .exists()metoden til et felt . Vi bruger .optional()til et optionalfelt. Tilsvarende isEmail()isInt()bruges til at validere emailog integer.

Hvis du ønsker, at et indtastningsfelt kun skal omfatte bestemte værdier, kan du bruge .isIn([]). Dette kræver en arrayaf værdier, og hvis du modtager andre værdier end ovenstående, kastes en fejl.

For eksempel kan statusfeltet i ovenstående kodestykke kun have en enabledeller disabledværdi. Hvis du angiver en anden værdi end den, kastes en fejl.

I /controllers/user.jslad os skrive en createUserfunktion, hvor du kan skrive forretningslogik. Det kaldes eftervalidate()med resultatet af valideringerne.

const { validationResult } = require('express-validator/check'); exports.createUser = async (req, res, next) => { try { const errors = validationResult(req); // Finds the validation errors in this request and wraps them in an object with handy functions if (!errors.isEmpty()) { res.status(422).json({ errors: errors.array() }); return; } const { userName, email, phone, status } = req.body const user = await User.create({ userName, email, phone, status, }) res.json(user) } catch(err) { return next(err) } }

Hvis du spekulerer på, hvad der er validationResult (req)?

Denne funktion finder valideringsfejlene i denne anmodning og indpakker dem i et objekt med praktiske funktioner

Når anmodningen nu inkluderer ugyldige kropsparametre eller userNamefelt mangler i req.body, vil din server svare sådan:

{ "errors": [{ "location": "body", "msg": "userName is required", "param": "userName" }] }

Så hvis userNameeller emailikke kunne opfylde valideringen, har hver fejl, der returneres efter .array()metode, følgende format som standard:

{ "msg": "The error message", "param": "param name", "value": "param value", // Location of the param that generated this error. // It's either body, query, params, cookies or headers. "location": "body", // nestedErrors only exist when using the oneOf function "nestedErrors": [{ ... }] }

Som du kan se, hjælper dette modul os virkelig med at tage sig af de fleste valideringer alene. Det opretholder også kodekvalitet og fokuserer primært på forretningslogik.

Dette var introduktionen til inputvalidering ved hjælp af ekspresvalideringsmodulet og tjek, hvordan du validerer en matrix af elementet og laver din egen brugerdefinerede validering i del 2 i denne serie.

Jeg har prøvet mit bedste og håber, at jeg dækkede nok til at forklare det detaljeret, så du kan komme i gang.

Hvis du støder på problemer, er du velkommen til at kontakte eller kommentere nedenfor.

Jeg hjælper gerne :)

Følg Shailesh Shekhawat for at få besked, når jeg offentliggør et nyt indlæg.

Tøv ikke med at klappe, hvis du betragter dette som en god læsning!

Oprindeligt offentliggjort på 101node.io den 2. september 2018.