Как сделать проверку ввода простой и чистой в вашем приложении Express.js

kak sdelat proverku vvoda prostoj i chistoj v vashem prilozhenii

Этот учебник требует предварительных знаний по использованию фреймворка expressjs

Почему нам нужна проверка на стороне сервера?

  • Вашей проверки на стороне клиента недостаточно, и она может быть разрушена
  • Более подвержен атакам Man в средних атаках, и сервер никогда не должен доверять клиенту
  • Пользователь может отключить JavaScript на стороне клиента и манипулировать данными

Если вы создавали веб-приложения с помощью фреймворка Express или любого другого фреймворка Node.js, проверка играет решающую роль в любой веб-программе, требующей от вас проверки запроса. body param query.

Написание собственной функции промежуточного программного обеспечения может быть громоздким, если

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

В этом учебнике вы узнаете, как проверить ввод в программе Express.js с помощью популярного модуля с открытым исходным кодом под названием express-validator.

Знакомство с экспресс-валидатором

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

express-validator — это набор промежуточного программного обеспечения express.js, который вращает функции validator.js и дезинфицирующего средства.

Модуль реализует пять важных API:

  • Проверьте API
  • API фильтров
  • API цепи дезинфекции
  • API цепи проверки
  • API результатов проверки

Давайте посмотрим на базового пользователя route без какого-либо модуля проверки для создания пользователя: /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)

Теперь в контроллере пользователя /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)
  }
}

Приведенный выше код является основным примером самостоятельной проверки полей.

Вы можете обрабатывать некоторые проверки в вашей пользовательской модели с помощью Mongoose. Для лучших практик мы хотим убедиться, что проверка проходит в бизнес-логике.

express-validator также позаботится обо всех этих проверках и очистках введенных данных.

Установка

npm install --save express-validator

Включать модуль в вашем основном 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)

Теперь используете экспресс-валидатор, ваш /routes/user.js будет таким:

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

Здесь userController.validate является функцией промежуточного программного обеспечения, которая приведена ниже. Он принимает method имя, для которого будет использоваться проверка.

Давайте создадим функцию промежуточного программного обеспечения validate()в нашем/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'])
       ]   
    }
  }
}

Пожалуйста, обратитесь к этой статье, чтобы узнать больше об определении функции и ее использовании.

The body функция будет только проверять req.body и принимает два довода. Первое – это property name. Во-вторых, ваш обычай message что будет показано, если проверка не завершится. Если вы не предоставите собственное сообщение, будет использовано сообщение по умолчанию.

Как видите, для а required поле, которое мы используем .exists() метод. Мы используем .optional()для optional поле. Аналогично isEmail() isInt() используется для подтверждения email и integer.

Если вы хотите, чтобы поле ввода включало только определенные значения, вы можете использовать .isIn([]). Для этого нужно array значений, и если вы получите значения, отличные от вышеприведенных, будет выдана ошибка.

Например, поле статуса в приведенном выше фрагменте кода может иметь только enabled или disabled значение. Если вы укажете любое другое значение, будет выдана ошибка.

в /controllers/user.js давайте напишем аcreateUser функция, где можно написать бизнес-логику. Это будет вызвано после validate() с результатами проверок.

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

Если вам интересно, что такое validationResult(req)?

Эта функция находит ошибки проверки в этом запросе и заворачивает их в объект с удобными функциями

Теперь, когда запрос содержит недействительные параметры тела или userName поле отсутствует req.bodyваш сервер ответит так:

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

Так что если userName или email не удалось удовлетворить проверку, тогда каждая ошибка возвращена .array()метод имеет такой формат по умолчанию:

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

Как видите, этот модуль действительно помогает нам самостоятельно выполнять большинство проверок. Он также поддерживает качество кода и в основном сосредотачивается на бизнес-логике.

Это было вступлением к проверке ввода с помощью экспресс-валидатор модуль и проверьте, как проверить массив элемента и произвести собственную проверку в части 2 этой серии.

Я приложил все усилия и надеюсь, что осветил достаточно, чтобы подробно объяснить это, чтобы вы могли начать.

Если у вас возникнут какие-то проблемы, не стесняйтесь свяжитесь или прокомментируйте ниже.
Буду рад помочь:)

Следите за Шайлешем Шехаватом, чтобы получать уведомления, когда я публикую новую публикацию.

Не стесняйтесь аплодировать, если вы считаете, что это стоит прочесть!

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *