Автор оригинала: Shailesh Shekhawat.
Почему нам нужна проверка на стороне сервера?
- Ваша проверка на стороне клиента недостаточно, и она может быть подорвана
- Более склонны к Человек в средних атаках и сервер никогда не должен доверять стороне клиента
- Пользователь может отключить проверку JavaScript на стороне клиента и манипулировать данными
Если вы создали веб-приложения с помощью Express Framework или любые другие структуры Node.js, Validation играет решающую роль в любом веб-приложении, который требует, чтобы вы подтверждаете запрос Тело
Param
Запрос
Отказ
Написание собственного промежуточного программного обеспечения может быть громоздким, если
- Вы хотите быстро двигаться, поддерживая качество кода или
- Вы хотите избежать использования Если
(
req.body.head)
или Если(
req.params.iscool)
В вашей основной функции контроллера, где вы определяете бизнес логику
В этом руководстве вы узнаете, как проверить вход в приложение Express.js, используя открытый источник и популярный модуль, называемый Экспресс-валидатор Отказ
Введение в экспресс-валидатор
Определение на GitHub говорит:
Модуль реализует пять важных API:
- Проверьте API
- Фильтр API
- Цепочка Sanitization API.
- Валидационная цепь API.
- Результат проверки API.
Давайте посмотрим на базовый пользователь Маршрут
Без какого-либо модуля валидации для создания пользователя: /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. Для передового опыта мы хотим убедиться, что проверка происходит до деловой логики.
Экспресс-валидатор позаботится обо всех этих проверках и Санитазация входов также.
Монтаж
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
это функция промежуточного программного обеспечения, которая объясняется ниже. Это принимает Метод
Имя, для которого будет использоваться проверка.
Давайте создадим функцию промежуточного программного обеспечения 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']) ] } } }
Пожалуйста, обратитесь к Эта статья Чтобы узнать больше о определении функции и его использования.
Тело
Функция будет проверять только req .body
и принимает два аргумента. Во-первых, это Имя недвижимости
Отказ Секунда твой пользовательский сообщение
Это будет показано, если проверка не удается. Если вы не предоставите пользовательское сообщение, то будет использоваться сообщение по умолчанию.
Как вы можете видеть, для Требуется
поле мы используем .exists ()
метод. Мы используем .optional ()
для Необязательно
поле. Точно так же ISEMAIL ()
isint ()
используется для проверки Email
и Целое число
Отказ
Если вы хотите входное поле, чтобы включить только определенные значения, вы можете использовать .isin ([])
Отказ Это занимает массив
значений, и если вы получаете значения, отличные от вышеизложенного, то будет брошена ошибка.
Например, поле состояния в вышеуказанном фрагменте кода может иметь только включен
или отключено
значение. Если вы предоставляете какое-либо значение, кроме того, ошибка будет брошена.
В /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) } }
Если вам интересно, что валидацияResult (REQ)?
Эта функция Находит ошибки проверки в этом запросе и оборачивает их в объекте с удобными функциями
Теперь всякий раз, когда запрос включает в себя неверные параметры тела или Имя пользователя
Поле отсутствует в req .body
Ваш сервер ответит так:
{ "errors": [{ "location": "body", "msg": "userName is required", "param": "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 года.