express js backend course process:- 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 :- step 1:- config/multer.js file code:- Folder upload setup // config/multer.js 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 }); step 2:- models/Course.js file code:- const mongoose = require('mongoose'); const CourseSchema = new mongoose.Schema({ title: String, description: String, }); module.exports = mongoose.model('Course', CourseSchema); models/Lecture.js file code:- 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 3:- routes routes/cousreRoutes.js file :- 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; routes/lectureRoutes.js file code:- const express = require('express'); const Course = require('../models/Course'); 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 }); //}); //testing router.get('/new/:courseId', async (req, res) => { try { const course = await Course.findById(req.params.courseId); if (!course) { return res.status(404).send('Course not found'); } res.render('lectures/new', { courseId: course._id, courseTitle: course.title // ✅ This is the missing part }); } catch (err) { console.error('Error loading course:', err); res.status(500).send('Server error'); } }); // 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; now for front end :- views/index.ejs fiel code:-

Courses

Add Course views/courses/edit.ejs file code:-

Edit Course

Cancel
view/courses/new.ejs :-

New Course



views/courses/show.ejs:-

<%= course.title %>

<%= course.description %>


Lectures

<% if (lectures.length === 0) { %>

No lectures yet.

<% } else { %> <% } %> now views/lectures/new.ejs:-

New Lecture for "<%= courseTitle %>"




now views/lectures/edit.ejs file :-

Edit Lecture