Как да направите валидирането на въвеждане просто и чисто в приложението си Express.js

Този урок изисква предварителни познания за използването на рамката expressjs

Защо се нуждаем от проверка от страна на сървъра?

  • Валидирането на вашата клиентска страна не е достатъчно и може да бъде отменено
  • По-предразположен към Man при средна атака и сървърът никога не трябва да се доверява на страната на клиента
  • Потребителят може да изключи валидирането на JavaScript от страна на клиента и да манипулира данните

Ако сте изграждали уеб приложения с помощта на Express Framework или друга рамка на Node.js, валидирането играе решаваща роля във всяко уеб приложение, което изисква да валидирате заявката за парам на тялото на заявката.

Написването на собствена функция за междинен софтуер може да бъде тромаво, ако

  • искате да се движите бързо, като поддържате качеството на кода или
  • искате да избегнете използването на if (req.body.head) или ако (req.params.isCool) в основната функция на контролера, където определяте бизнес логиката

В този урок ще научите как да валидирате въвеждането в приложението Express.js, като използвате отворен код и популярен модул, наречен експрес-валидатор.

Въведение в експрес-валидатора

Определението на Github гласи:

express-validator е набор от средно ниво на express.js, който обвива validator.js валидатор и функции за дезинфекция.

Модулът реализира пет важни API:

  • Проверете API
  • API за филтриране
  • API за санитарна верига
  • API на веригата за валидиране
  • API за резултат на валидиране

Нека да разгледаме основен маршрут на потребителя без никакъв модул за валидиране, за да създадем потребител: /route/user.js

/ **
* @api {post} / api / user Създаване на потребител
* @apiName Създайте нов потребител
* @apiPermission администратор
* @apiGroup потребител
*
* потребителско име за @apiParam {String} [userName]
* @apiParam {String} [имейл] Имейл
* @apiParam {String} [телефон] Телефонен номер
* @apiParam {String} [статус] Състояние
*
* @apiSuccess (200) {Object} смесен обект `User`
* /
router.post ('/', userController.createUser)

Сега в потребителски контролер /controllers/user.js

const User = изисквам ('./ модели / потребител')
export.createUser = (req, res, next) => {
  / ** Тук трябва да потвърдите потребителското въвеждане.
   Да кажем, че само име и имейл са задължителни
 * /
  
  const {userName, имейл, телефон, статус} = req.body
  ако (userName && имейл && isValidEmail (имейл)) {
    
    // isValidEmail е някаква персонализирана имейл функция за валидиране на имейл, която може да се наложи да напишете самостоятелно или да използвате npm модул
    User.create ({
      потребителско име,
      електронна поща,
      телефон,
      статус,
    })
    .then (потребител => res.json (потребител))
    .catch (до)
  }
}

Горният код е само основен пример за валидиране на полета самостоятелно.

Можете да се справите с някои валидации на вашия потребителски модел, като използвате Mongoose. За най-добри практики искаме да се уверим, че валидирането се случва преди бизнес логиката.

експрес-валидаторът ще се погрижи и за всички тези проверки и за санирането на входните данни.

Инсталация

npm install - запазване на експресен валидатор

Включете модула във вашия основен файл server.js:

const express = изисквам ('express')
const bodyParser = изисквам ('body-parser')
const expressValidator = изисквам ('express-валидатор')
приложение const = express ()
const router = express.Router ()
app.use (bodyParser.json ())
app.use (expressValidator ())
app.use ('/ api', рутер)

Сега, използвайки експрес-валидатор, /routes/user.js ще бъде такъв:

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

Тук userController.validate е функция за междинен софтуер, която е обяснена по-долу. Той приема името на метода, за който ще се използва валидирането.

Нека да създадем функция за междинен софтуер, да валидира () в нашите / kontroleri / user.js:

const {body} = изисквам ('експресен валидатор / чек')
export.validate = (метод) => {
превключвател (метод) {
    case 'createUser': {
     връщане [
        body ('userName', 'userName не съществува'). съществува (),
        body („имейл“, „Невалиден имейл“). съществува (). isEmail (),
        тяло ( "телефон"). по избор (). isInt (),
        body ('status'). незадължително (). isIn (['enable', 'disabled'])
       ]
    }
  }
}

Моля, вижте тази статия, за да знаете повече за дефиницията на функцията и нейната употреба.

Функцията body ще валидира req.body и ще вземе два аргумента. Първо е името на свойството. Второ е вашето персонализирано съобщение, което ще бъде показано, ако валидирането не успее. Ако не предоставите персонализирано съобщение, ще бъде използвано съобщението по подразбиране.

Както можете да видите, за задължително поле използваме метода .exists (). Използваме .optional () за незадължително поле. По същия начин isEnt () isInt () се използва за валидиране на имейл и цяло число.

Ако искате полето за въвеждане да включва само определени стойности, тогава можете да използвате .isIn ([]). Това отнема масив от стойности и ако получите стойности, различни от горните, ще бъде изхвърлена грешка.

Например полето за състояние в горния фрагмент на код може да има само активирана или деактивирана стойност. Ако предоставите друга стойност, различна от тази, ще бъде изхвърлена грешка.

В /controllers/user.js нека пишем функция acreateUser, където можете да пишете бизнес логика. Той ще бъде извикан след validate () с резултата от валидирането.

export.createUser = (req, res, next) => {
   REQ
   .getValidationResult () // за да получите резултата от по-горе валидиране fn
   .След (validationHandler ())
   .then (() => {
      const {userName, имейл, телефон, статус} = req.body
      
      User.create ({
        потребителско име,
        електронна поща,
        телефон,
        статус,
      })
      .then (потребител => res.json (потребител))
   })
   .catch (до)
}

Чудите ли се какво е req.getValidationResult ()?

Това е нова функция, използвана от Express-валидатора. Тази функция връща обект, ако има някакви грешки при валидирането. Обектът изглежда по-долу:

{
  param: "име на полето",
 
  msg: "съобщение за грешка",
  стойност: "<стойност на въвеждане на поле>"
}

Но как бихте върнали .msg от този обект в отговор на вашия API?

Нека да напишем функция за обработка за това:

const validationHandler = next => резултат => {
  ако (result.isEmpty ()) се върне
  ако (! следващия)
    хвърли нова грешка (
      result.array (). map (i => `'$ {i.param}' има $ {i.msg}`) .join ('')
    )
още
  връщане следващия (
    нова грешка (
     result.array (). map (i => `'$ {i.param}' има $ {i.msg}`) .join ('')
    )
  )
}

Ако се чувствате така, моля да се мотаете !!

Сега се върнем към нашата функция за обработка на валидиране, която е функция на къри.

Вътрешната функция взема резултата, предоставен от метода getValidationResult. Външната функция приема следващия междинен софтуер.

Така че, ако и потребителското име и имейл не успяха да удовлетворят валидирането, всяка грешка, върната чрез метода .array (), има следния формат по подразбиране:

{
  "msg": "Съобщение за грешка",
   
  "param": "име на парам",
  
  "value": "param value",
// Местоположение на парама, който генерира тази грешка. // Това е или body, query, params, cookies или headers.
  "местоположение": "тяло",
// nestedErrors съществуват само при използване на функцията oneOf
  "nestedErrors": [{...}]
}

Така че, ако има някакви грешки, тогава validationHandler ще анализира и ги прехвърли към следващия междинен софтуер. Ако няма грешка, ще получите празен масив, който удовлетворява първото условие във функцията.

Както можете да видите, този модул наистина ни помага да се грижим сами за повечето валидации. Освен това поддържа качеството на кода и се фокусира главно върху бизнес логиката.

Това беше въвеждането на валидирането на вход с помощта на модула за експресно валидиране и проверете как да валидирате масив от елемента и да направите свое собствено валидиране в част 2 от тази серия.

Опитах всичко възможно и се надявам да покрия достатъчно, за да го обясня подробно, за да можете да започнете.

Ако срещнете някакви проблеми, не се колебайте да се свържете или да коментирате по-долу.
Ще се радвам да помогна :)

Следвайте Shailesh Shekhawat, за да получавате известия, когато публикувам нова публикация.

Не се колебайте да ръкопляскате, ако смятате, че това си заслужава да прочетете!

Първоначално публикуван на 101node.io на 2 септември 2018 г.