Acest tutorial necesită cunoștințe prealabile despre utilizarea expressjs cadru

De ce avem nevoie de validare pe partea de server?

  • Validarea clientului dvs. nu este suficientă și poate fi subversată
  • Mai predispus la Om în atacuri de mijloc, iar serverul nu ar trebui niciodată să aibă încredere în partea clientului
  • Un utilizator poate dezactiva validarea JavaScript pe partea de client și manipula datele

Dacă ați construit aplicații web utilizând un cadru Express sau orice alt cadru Node.js, validarea joacă un rol crucial în orice aplicație web care necesită validarea cererii body param query.

Scrierea propriei funcții middleware poate fi greoaie dacă

  • doriți să vă deplasați rapid, menținând în același timp calitatea codului sau
  • doriți să evitați utilizarea if (req.body.head) sau if (req.params.isCool) în funcția principală de controler în care definiți logica de afaceri

În acest tutorial, veți învăța cum să validați intrarea într-o aplicație Express.js utilizând un modul open source și popular numit expres-validator.

Introducere în expres-validator

Definiția de pe Github spune:

expres-validator este un set de express.js middlewares care împachetează validator.js funcții de validare și dezinfectare.

Modulul implementează cinci API-uri importante:

  • Verificați API
  • API filtru
  • API lanț de igienizare
  • API lanț de validare
  • API rezultat validare

Să aruncăm o privire la un utilizator de bază route fără niciun modul de validare pentru a crea un utilizator: /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)

Acum, în controlerul utilizatorului /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)
  }
}

Codul de mai sus este doar un exemplu de bază de validare a câmpurilor pe cont propriu.

Puteți gestiona unele validări în modelul dvs. de utilizator utilizând Mongoose. Pentru cele mai bune practici, dorim să ne asigurăm că validarea are loc înainte de logica afacerii.

expres-validator se va ocupa de toate aceste validări și de igienizare de intrări, de asemenea.

Instalare

npm install --save express-validator

Include modul în principal server.js fişier:

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)

Acum folosind expres-validator, ta /routes/user.js va fi așa:

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

Aici userController.validate este o funcție middleware care este explicată mai jos. Acceptă method numele pentru care va fi utilizată validarea.

Să creăm o funcție middleware validate()în a noastră/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'])
       ]   
    }
  }
}

Va rog, referiti-va la Acest articol pentru a afla mai multe despre definirea funcției și utilizarea acesteia.

body funcția va valida numai req.body și ia două argumente. În primul rând este property name. Al doilea este obiceiul tău message care va fi afișat dacă validarea eșuează. Dacă nu furnizați un mesaj personalizat, atunci va fi utilizat mesajul implicit.

După cum puteți vedea, pentru un required câmpul pe care îl folosim .exists() metodă. Folosim .optional()pentru un optional camp. În mod similar isEmail() isInt() este folosit pentru a valida email și integer.

Dacă doriți ca un câmp de introducere să includă numai anumite valori, atunci puteți utiliza .isIn([]). Acest lucru necesită un array de valori, iar dacă primiți alte valori decât cele de mai sus, atunci va fi aruncată o eroare.

De exemplu, câmpul de stare din fragmentul de cod de mai sus poate avea doar un enabled sau disabled valoare. Dacă furnizați altă valoare decât aceasta, va fi aruncată o eroare.

În /controllers/user.js să scriem uncreateUser funcție în care puteți scrie logică de afaceri. Va fi chemat după validate() cu rezultatul validărilor.

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)
   }
}

Dacă vă întrebați ce este validationResult (req)?

Această funcție găsește erorile de validare în această cerere și le înfășoară într-un obiect cu funcții utile

Acum, ori de câte ori cererea include parametrii corpului nevalizi sau userName câmpul lipsește în req.body, serverul dvs. va răspunde astfel:

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

Astfel, dacă userName sau email nu a reușit să satisfacă validarea, apoi fiecare eroare returnată de .array()metoda are următorul format în mod implicit:

{   
  "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": [{ ... }] 
}

După cum puteți vedea, acest modul ne ajută cu adevărat să avem grijă de majoritatea validărilor de unul singur. Păstrează și calitatea codului și se concentrează în principal pe logica afacerii.

Aceasta a fost introducerea la validarea intrărilor folosind expres-validator modul și verificați cum să validați o matrice a articolului și să vă faceți propria validare personalizată în partea 2 a acestei serii.

Am încercat din răsputeri și sper că am acoperit suficient cât să-l explic în detaliu, astfel încât să puteți începe.

Dacă întâmpinați probleme, nu ezitați Intră atingere sau comentează mai jos.
Aș fi bucuros să vă ajut 🙂

Urmăriți-l pe Shailesh Shekhawat pentru a primi o notificare ori de câte ori public o nouă postare.

Nu ezitați să bateți din palme dacă ați considerat că este o lectură utilă!

Publicat inițial la 101node.io pe 2 septembrie 2018.