валидация курсов

routes/add.js

const {Router} = require('express'); //или const express.Router = require('express');
const Course = require('../models/course');
const auth = require('../middleware/auth');//модуль middleware , для защиты ройтов
const {validationResult} = require('express-validator');//валидация работающая с express
const {courseValidators} = require('../validator/validator');//middleware - мой валидатор на основе express-validator
 
const router = Router();
 
 
 
/**
 * страница add
 * Обработка POST запроса
 * @params '/' адрес страницы, в данном случае используется префикс при регистрации ройтера,
 * там страничка зарегестрирована как /add
 * @params auth - зашит роута
 * @params courseValidators  - валидатор
 * четвертый параметр асинхронный callback - обработчик запроса req - request , запрос от браузера
 * res - response, ответ сервера
 */
router.post('/', auth, courseValidators,async (req, res) => {//асинхронная функция
 
    const error = validationResult(req);//получить результирующую ошибку если она есть
 
    if(!error.isEmpty()){//если ошибка присутствует
        return res.status(422).render('add', {
            title:'Добавить курс',//прокидываем параметры в шаблон
            isAdd: true,
            error: error.array()[0].msg,
            data:{//подстановка веденных данных после ошибки, что бы не заполнять форму повторно
                title: req.body.title,
                price: req.body.price,
                img: req.body.img
            }
    	});//рендерим используя шаблонизатор
        // , 422 -код ошибки валидации
    }
 
 
    //res.end(JSON.stringify(req.body));//Распечать POST на страничке
    try{
        const course =  new Course({//модель для добавления новых курсов
            title: req.body.title,//Поля для записи в БД
            price: req.body.price,
            img: req.body.img,
            userId: req.user._id//Связка с таблице User
        });
 
        await  course.save();//сохранить запись
        res.redirect('/courses');//Редирект на страницу с курсами
    }catch(e){
        console.log(e);
    }
});
 
module.exports = router;//Экспортирум роутер

validator/validator.js

const {body, sanitizeBody} = require('express-validator');//валидация работающая с express
 
 
/**
 * Название валидатора произвольное, форма добавление нового курса
 * @type {*[]}
 */
exports.courseValidators = [
    body('title').isLength({min:3}).withMessage('Минимальная длина названия 3 символа').trim(),
    body('price').isNumeric().withMessage('Введите корректную цену'),
    body('img', 'введите корректно url').isURL()
];

template/add.hbs

<h1>Добавить курс</h1>
{{#if error}}
<p class="alert">{{error}}</p>
{{/if}}
<div class="row">
    <form class="col s12" action="/add" method="post">
        <div class="row">
            <div class="input-field col s6">
                <input  id="title" type="text" name="title" value="{{data.title}}" class="validate" required>
                <label for="title">Название курсв</label>
                <span class="helper-text" data-error="Введите название" data-success="right"></span>
            </div>
            <div class="input-field col s6">
                <input id="price" type="text" name="price" value="{{data.price}}" class="validate" required>
                <label for="price">Цена</label>
                <span class="helper-text" data-error="Введите цену" data-success="right"></span>
            </div>
        </div>
        <div class="row">
            <div class="input-field col s6">
                <input  id="img" type="text" name="img" value="{{data.img}}" required class="validate">
                <label for="img">url картинки</label>
                <span class="helper-text" data-error="создайте url" data-success="right"></span>
            </div>
 
        </div>
        <div class="row">
            <div class="input-field col s6">
                <input type="hidden" name="_csrf" value="{{csrf}}">
                <input id="price" type="submit"  class="btn" value="добавить курс">
            </div>
        </div>
    </form>
</div>