full CRUD setup for Courses and Lectures using Express.js (backend), React.js (frontend), and MongoDB. We’ll create Courses and Lectures, where each course can have multiple lectures. I’ll break it down step by step. 1️⃣ Backend: Express.js + MongoDB Step 1: Setup mkdir course-management cd course-management npm init -y npm install express mongoose cors body-parser nodemon Create a server.js: const express = require("express"); const mongoose = require("mongoose"); const cors = require("cors"); const app = express(); app.use(cors()); app.use(express.json()); // MongoDB connection mongoose.connect("mongodb://127.0.0.1:27017/courseDB", { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => console.log("MongoDB connected")) .catch(err => console.log(err)); // Models const LectureSchema = new mongoose.Schema({ title: String, content: String, }); const CourseSchema = new mongoose.Schema({ name: String, description: String, lectures: [LectureSchema], }); const Course = mongoose.model("Course", CourseSchema); // Routes // Get all courses app.get("/courses", async (req, res) => { const courses = await Course.find(); res.json(courses); }); // Get a single course app.get("/courses/:id", async (req, res) => { const course = await Course.findById(req.params.id); res.json(course); }); // Create a course app.post("/courses", async (req, res) => { const course = new Course(req.body); await course.save(); res.json(course); }); // Update a course app.put("/courses/:id", async (req, res) => { const course = await Course.findByIdAndUpdate(req.params.id, req.body, { new: true }); res.json(course); }); // Delete a course app.delete("/courses/:id", async (req, res) => { await Course.findByIdAndDelete(req.params.id); res.json({ message: "Course deleted" }); }); // Add lecture to a course app.post("/courses/:id/lectures", async (req, res) => { const course = await Course.findById(req.params.id); course.lectures.push(req.body); await course.save(); res.json(course); }); // Update a lecture app.put("/courses/:courseId/lectures/:lectureId", async (req, res) => { const course = await Course.findById(req.params.courseId); const lecture = course.lectures.id(req.params.lectureId); lecture.set(req.body); await course.save(); res.json(course); }); // Delete a lecture app.delete("/courses/:courseId/lectures/:lectureId", async (req, res) => { const course = await Course.findById(req.params.courseId); course.lectures.id(req.params.lectureId).remove(); await course.save(); res.json(course); }); app.listen(5000, () => console.log("Server running on port 5000")); ✅ Backend is ready! Frontend: React.js Step 1: Setup npx create-react-app course-frontend cd course-frontend npm install axios react-router-dom Let’s set up a clean working structure for your React frontend with correct imports/exports so you won’t see the “Element type is invalid” error. 1️⃣ Folder Structure src/ components/ CourseList.js CourseDetail.js CreateCourse.js UpdateCourse.js api.js App.js index.js 2️⃣ API File (api.js) import axios from "axios"; const API = axios.create({ baseURL: "http://localhost:5000" }); // Courses export const getCourses = () => API.get("/courses"); export const getCourse = (id) => API.get(`/courses/${id}`); export const createCourse = (data) => API.post("/courses", data); export const updateCourse = (id, data) => API.put(`/courses/${id}`, data); export const deleteCourse = (id) => API.delete(`/courses/${id}`); // Lectures export const addLecture = (courseId, data) => API.post(`/courses/${courseId}/lectures`, data); export const updateLecture = (courseId, lectureId, data) => API.put(`/courses/${courseId}/lectures/${lectureId}`, data); export const deleteLecture = (courseId, lectureId) => API.delete(`/courses/${courseId}/lectures/${lectureId}`); ✅ All API calls are default exported via functions. 3️⃣ Components CourseList.js import React, { useEffect, useState } from "react"; import { getCourses, deleteCourse } from "../api"; import { Link } from "react-router-dom"; const CourseList = () => { const [courses, setCourses] = useState([]); useEffect(() => { fetchCourses(); }, []); const fetchCourses = async () => { try { const { data } = await getCourses(); setCourses(data); } catch (err) { console.error(err); } }; const handleDelete = async (id) => { await deleteCourse(id); fetchCourses(); }; return (
{course.description}
Edit Course