модели

models/course.js

const uuid  = require('uuid/v4'); //подключаем модуль для создания уникальных идентификаторов, 4-ой версии
const fs = require('fs');// модуль для взаимодействия с файловой системой
const path =  require('path');//модуль для генерации путей к файлам
 
/**
 * Добавить запись в файл , данные из формы на странице add
 */
class Course{
    /**
     * Инициализация полей формы
     * @param title загловок
     * @param price цена
     * @param img url картиеки
     */
    constructor(title, price, img){
        this.title = title;
        this.price = price;
        this.img = img;
        this.id = uuid();//Сохдаем идентификатор
    }
 
    /**
     * Вернуть объект с данными
     * @returns {string}
     */
    toJSON(){
        return {
            title:this.title,
            price:this.price,
            img:this.img,
            id:this.id
        };
    }
 
    /**
     * Записать данные в файл, венуть промис
     * @returns {Promise}
     */
    async save(){
        const courses = await Course.getAll();//получить массив из файла
        courses.push(this.toJSON());//добавить объект сформированный из данных формы в массив
 
        return new Promise((resolve, reject) => {// - возвращаем промис, проверяем ответ либо через async away, либо then
            fs.writeFile(//Запись в файл
                path.join(__dirname, '..', 'data', 'courses.json'),//генерируем путь файлу
                JSON.stringify(courses),//преобразуем массив в JSON
                (err) => {
                    if(err){//если запись не удалась вернем ошибку
                        reject();
                    }
 
                    resolve();//если все хорошо
                }
            );
 
        }) ;
 
    }
 
    /**
     * Прочитать файл и вернуть из него данные
     * @returns {Promise} - возвращаем промис, проверяем ответ либо через async away, либо then
     */
    static getAll(){
 
        return new Promise((resolve, reject) =>{
            fs.readFile(//читаем файл
                path.join(__dirname, '..','data', 'courses.json'),//генерируем путь к файлу
                'utf-8',//кодировка
                (err, data) => {//callback имеет два параметра ошибка , и данные из файла
                    if(err){
                        reject(err)//если мы отловили ошибку
                    }
                    resolve(JSON.parse(data));//в случае успеха вернем распарсенную строку JSON
                }
            );
        });
 
    }
}
 
module.exports = Course;//Экспортирум класс в роутер

routes/add.js

const {Router} = require('express'); //или const express.Router = require('express');
const Course = require('../models/course');
 
const router = Router();
 
 
/**
 * страница add
 * Обработка POST запроса
 * первый параметр адрес страницы, в данном случае используется префикс при регистрации ройтера,
 * там страничка зарегестрирована как /add
 * второй параметр callback - обработчик запроса req - request , запрос от браузера
 * res - response, ответ сервера
 */
router.post('/',async (req, res) => {//асинхронная функция
   // res.status(200);//вернуть статус ответа
    console.log(req.body);//Данные POST
    //res.end(JSON.stringify(req.body));//Распечать POST на страничке
 
    const course = new Course(req.body.title, req.body.price, req.body.img);
    await course.save();//сохраняем запись в файл
 
    res.redirect('/courses');//Редирект на страницу с курсами
 
});
 
module.exports = router;//Экспортирум роутер

data/courses.json

{"title":"Тест","price":"300","img":"https://stackoverflow.com/","id":"6b680b10-d128-4fc0-9ccc-230823f6776d"}]