Express.js CRUD application with: MongoDB (Mongoose) backend Video & PDF upload Course and Lecture model EJS frontend templates Open command prompt and create project folder by using following commands :- mkdir course-app cd course-app and then type :- npm init -y and then Install dependencies npm install express mongoose multer ejs dotenv method-override then you will see your project folder like this :- create config folder and create following file:- File Upload Setup multer.js file code:- const multer = require('multer'); const path = require('path'); const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'public/uploads/'); }, filename: function (req, file, cb) { cb(null, Date.now() + path.extname(file.originalname)); } }); module.exports = multer({ storage: storage }); and create .env file :- MONGO_URI=mongodb://localhost:27017/courseApp step 1: create models folder and inside it create two files Models Course.js file:- const mongoose = require('mongoose'); const CourseSchema = new mongoose.Schema({ title: String, description: String, }); module.exports = mongoose.model('Course', CourseSchema); Lecture.js file:- const mongoose = require('mongoose'); const LectureSchema = new mongoose.Schema({ courseId: { type: mongoose.Schema.Types.ObjectId, ref: 'Course' }, title: String, videoUrl: String, notesUrl: String, }); module.exports = mongoose.model('Lecture', LectureSchema); Step 2:- create routes folder and inside it create courseRoutes.js and lectureRoutes.js file :- Routes courseRoutes.js file code :- const express = require('express'); const router = express.Router(); const Course = require('../models/Course'); const Lecture = require('../models/Lecture'); // List all courses router.get('/', async (req, res) => { const courses = await Course.find(); res.render('courses/index', { courses }); }); // New Course Form router.get('/new', (req, res) => { res.render('courses/new'); }); // Create a new course router.post('/', async (req, res) => { await Course.create(req.body); res.redirect('/courses'); }); // Edit Course Form (must come BEFORE '/:id') router.get('/:id/edit', async (req, res) => { try { const course = await Course.findById(req.params.id); if (!course) return res.status(404).send('Course not found'); res.render('courses/edit', { course }); } catch (err) { console.error(err); res.status(500).send('Server Error'); } }); // Update Course router.put('/:id', async (req, res) => { try { await Course.findByIdAndUpdate(req.params.id, req.body); res.redirect(`/courses/${req.params.id}`); } catch (err) { console.error(err); res.status(500).send('Update failed'); } }); // Delete Course (and its lectures) router.delete('/:id', async (req, res) => { try { const courseId = req.params.id; await Lecture.deleteMany({ courseId }); // delete associated lectures await Course.findByIdAndDelete(courseId); res.redirect('/courses'); } catch (err) { console.error(err); res.status(500).send('Delete failed'); } }); // Show course and its lectures router.get('/:id', async (req, res) => { try { const course = await Course.findById(req.params.id); if (!course) return res.status(404).send('Course not found'); const lectures = await Lecture.find({ courseId: course._id }); res.render('courses/show', { course, lectures }); } catch (err) { console.error(err); res.status(500).send('Error loading course'); } }); module.exports = router; lectureRoutes.js file code :- const express = require('express'); const router = express.Router(); const upload = require('../config/multer'); const Lecture = require('../models/Lecture'); const fs = require('fs'); const path = require('path'); // Show New Lecture Form router.get('/new/:courseId', (req, res) => { res.render('lectures/new', { courseId: req.params.courseId }); }); // Create Lecture router.post('/', upload.fields([{ name: 'video' }, { name: 'notes' }]), async (req, res) => { const { title, courseId } = req.body; const video = req.files['video']?.[0]?.filename || ''; const notes = req.files['notes']?.[0]?.filename || ''; await Lecture.create({ title, courseId, videoUrl: '/uploads/' + video, notesUrl: '/uploads/' + notes, }); res.redirect(`/courses/${courseId}`); }); // Edit Lecture Form router.get('/:id/edit', async (req, res) => { const lecture = await Lecture.findById(req.params.id); if (!lecture) return res.status(404).send('Lecture not found'); res.render('lectures/edit', { lecture }); }); // Update Lecture router.put('/:id', upload.fields([{ name: 'video' }, { name: 'notes' }]), async (req, res) => { const lecture = await Lecture.findById(req.params.id); if (!lecture) return res.status(404).send('Lecture not found'); const { title } = req.body; if (req.files['video']) { if (lecture.videoUrl) fs.unlinkSync('public' + lecture.videoUrl); lecture.videoUrl = '/uploads/' + req.files['video'][0].filename; } if (req.files['notes']) { if (lecture.notesUrl) fs.unlinkSync('public' + lecture.notesUrl); lecture.notesUrl = '/uploads/' + req.files['notes'][0].filename; } lecture.title = title; await lecture.save(); res.redirect(`/courses/${lecture.courseId}`); }); // Delete Lecture router.delete('/:id', async (req, res) => { const lecture = await Lecture.findById(req.params.id); if (!lecture) return res.status(404).send('Lecture not found'); if (lecture.videoUrl) fs.unlinkSync('public' + lecture.videoUrl); if (lecture.notesUrl) fs.unlinkSync('public' + lecture.notesUrl); const courseId = lecture.courseId; await Lecture.findByIdAndDelete(req.params.id); res.redirect(`/courses/${courseId}`); }); module.exports = router; Step 3:- Now create views folder and inside it create courses folder and inside courses folder create following files index.ejs:-