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>