A complete online testing and quiz management system built with Node.js, Express.js, MongoDB, EJS, and MVC architecture featuring authentication, quiz management, analytics, and leaderboard functionality.
Documented Β· MIT licensed Β· Maintained
QuizMaster is a complete Online Testing System built with Node.js, Express.js, MongoDB, and EJS. It allows admins to create and manage quizzes, and students to attempt quizzes, view results, and compete on leaderboards.
This project is developed as part of a backend development course and follows MVC architecture with RESTful API principles.
- Muhammad Afzal Kalwar
- Ayesha Bibi
- Hafsa Kanwal Awan
- β Create, Edit, Delete Quizzes
- β Add, Edit, Delete Questions
- β View all Students
- β View Quiz Attempts
- β View Leaderboard
- β Analytics & Dashboard
- β System Statistics
- β Register & Login
- β Browse Available Quizzes
- β Attempt Quizzes with Timer
- β Submit Answers & View Results
- β View Score & Percentage
- β View Leaderboard
- β Track Previous Attempts
- β View Performance History
- Node.js - JavaScript runtime
- Express.js - Web framework
- MongoDB - NoSQL database
- Mongoose - ODM for MongoDB
- EJS - Template engine
- Express-Session - Session management
- MVC Architecture - Model-View-Controller pattern
- RESTful APIs - REST principles for API design
- Middleware - Custom middleware for logging, auth, errors
- Async/Await - Asynchronous programming
- Node.js fs module - File system operations
- path module - Path utilities
- events module - Event emitter pattern
- MongoDB Aggregation Pipeline - Advanced queries
- Error Handling Middleware - Centralized error management
- β React, Angular, Next.js
- β TypeScript
- β JWT Authentication
- β Redux
- β Docker
- β Redis
- β Socket.io
- β GraphQL
quizmaster/
β
βββ config/
β βββ db.js # MongoDB connection configuration
β
βββ models/
β βββ User.js # User schema (admin/student)
β βββ Quiz.js # Quiz schema
β βββ Question.js # Question schema
β βββ Attempt.js # Quiz attempt schema
β βββ Result.js # Quiz result schema
β
βββ controllers/
β βββ authController.js # Authentication logic
β βββ quizController.js # Quiz CRUD operations
β βββ questionController.js # Question management
β βββ attemptController.js # Quiz attempts & results
β βββ adminController.js # Admin operations
β
βββ routes/
β βββ authRoutes.js # Auth endpoints
β βββ quizRoutes.js # Quiz endpoints
β βββ questionRoutes.js # Question endpoints
β βββ attemptRoutes.js # Attempt endpoints
β βββ adminRoutes.js # Admin endpoints
β
βββ middleware/
β βββ loggerMiddleware.js # Request logging
β βββ errorMiddleware.js # Error handling
β βββ authMiddleware.js # Authentication guards
β
βββ views/
β βββ index.ejs # Home page
β βββ login.ejs # Login page
β βββ register.ejs # Registration page
β βββ dashboard.ejs # Student dashboard
β βββ quizzes.ejs # Quizzes list
β βββ quizDetails.ejs # Quiz details
β βββ attemptQuiz.ejs # Quiz attempt page
β βββ result.ejs # Result page
β βββ leaderboard.ejs # Leaderboard page
β βββ studentResults.ejs # Student results
β βββ myAttempts.ejs # Student attempts
β βββ error.ejs # Error page
β βββ admin/
β βββ adminDashboard.ejs # Admin dashboard
β βββ adminQuizzes.ejs # Manage quizzes
β βββ addQuiz.ejs # Add quiz form
β βββ editQuiz.ejs # Edit quiz form
β βββ manageUsers.ejs # Manage students
β βββ manageQuestions.ejs # Manage questions
β βββ addQuestion.ejs # Add question form
β βββ editQuestion.ejs # Edit question form
β βββ quizAttempts.ejs # Quiz attempts view
β βββ analytics.ejs # Analytics dashboard
β
βββ public/
β βββ css/
β β βββ style.css # Main stylesheet
β βββ js/
β β βββ main.js # Main client-side JS
β β βββ quiz-timer.js # Quiz timer functionality
β βββ images/
β
βββ data/
β βββ logs.txt # Request logs
β
βββ app.js # Main application file
βββ package.json # Dependencies & metadata
βββ README.md # This file
{
name: String,
email: String (unique),
password: String,
role: String ("admin" | "student"),
createdAt: Date
}{
title: String,
category: String,
difficulty: String ("Easy" | "Medium" | "Hard"),
totalMarks: Number,
timeLimit: Number (minutes),
createdBy: ObjectId (User),
createdAt: Date
}{
quizId: ObjectId (Quiz),
questionText: String,
optionA: String,
optionB: String,
optionC: String,
optionD: String,
correctAnswer: String ("A" | "B" | "C" | "D"),
marks: Number
}{
studentId: ObjectId (User),
quizId: ObjectId (Quiz),
answers: Map (questionId -> answer),
score: Number,
totalQuestions: Number,
attemptedAt: Date
}{
studentName: String,
quizTitle: String,
score: Number,
totalMarks: Number,
percentage: Number,
submittedAt: Date,
studentId: ObjectId (User),
quizId: ObjectId (Quiz)
}- Node.js (v14 or higher)
- MongoDB (running on localhost:27017)
- npm package manager
cd quizmaster
npm installThis installs:
express- Web frameworkmongoose- MongoDB ODMejs- Template engineexpress-session- Session managementnodemon- Development tool (auto-restart)
Ensure MongoDB is running:
# On Windows
mongod
# On macOS/Linux
brew services start mongodb-communityCreate the database:
// Connect to MongoDB and it will create database automatically
// Database: quizmasterDB
// Connection: mongodb://127.0.0.1:27017/quizmasterDBDevelopment Mode (with auto-reload):
npm run devProduction Mode:
npm start- URL: http://localhost:3000
- Home Page: http://localhost:3000/
GET /register- Registration pagePOST /register- Register new studentGET /login- Login pagePOST /login- Login userGET /logout- Logout user
GET /quizzes- Get all quizzesGET /quizzes/:id- Get quiz detailsGET /quizzes/admin/create- Create quiz pagePOST /quizzes/admin/create- Create quizGET /quizzes/admin/:id/edit- Edit quiz pagePUT /quizzes/admin/:id/edit- Update quizDELETE /quizzes/admin/:id/delete- Delete quiz
GET /questions/quiz/:quizId/questions- List questionsGET /questions/quiz/:quizId/add- Add question pagePOST /questions/quiz/:quizId/add- Create questionGET /questions/quiz/:quizId/:questionId/edit- Edit question pagePUT /questions/quiz/:quizId/:questionId/edit- Update questionDELETE /questions/quiz/:quizId/:questionId/delete- Delete question
GET /quiz/:quizId/start- Start quizPOST /quiz/:quizId/submit- Submit quizGET /result/:resultId- View resultGET /my-attempts- View attemptsGET /my-results- View results
GET /admin/dashboard- Admin dashboardGET /admin/quizzes- Manage quizzesGET /admin/students- Manage studentsGET /admin/leaderboard- View leaderboardGET /admin/analytics- View analyticsGET /admin/quiz/:quizId/attempts- Quiz attempts
- Uses
express-sessionfor session management - No JWT tokens (as per requirements)
- User data stored in session after login
// Admin-only routes
isAdmin middleware checks req.session.role === 'admin'
// Student-only routes
isStudent middleware checks req.session.role === 'student'
// Protected routes
isAuthenticated middleware checks req.session.userId exists- Student Login: Select "student" role
- Admin Login: Select "admin" role
- Password validation: Simple string comparison
- CRUD operations with full validation
- Difficulty levels: Easy, Medium, Hard
- Categories: General Knowledge, Science, Math, etc.
- Time limits and total marks
- Multiple choice questions (A, B, C, D)
- Mark allocation per question
- Automatic validation
// Score Calculation Formula
percentage = (score / totalMarks) * 100
// Example:
// Obtained: 75 marks
// Total: 100 marks
// Percentage = (75 / 100) * 100 = 75%// Aggregation Pipeline
db.results.aggregate([
{
$group: {
_id: '$studentName',
averageScore: { $avg: '$percentage' },
totalAttempts: { $sum: 1 },
totalScore: { $sum: '$score' }
}
},
{ $sort: { averageScore: -1 } },
{ $limit: 100 }
])- Logs stored in
data/logs.txt - Format:
[timestamp] METHOD URL - IP: ipaddress - Uses fs module for file operations
- Automatic file creation if not exists
- Centralized error middleware
- Validation error handling
- Database error handling
- 404 page not found
- Custom error views
userRegistered- When new user registersuserLogin- When user logs inquizCreated- When quiz is createdquizSubmitted- When quiz is submitted- Event logging to console
-
Create a student account:
- Go to
/register - Fill in name, email, password
- Login with student role
- Go to
-
Admin account (use default or create):
- Login with admin role
- Access
/admin/dashboard
As Admin:
- Create a quiz (e.g., "Math Quiz")
- Add questions to the quiz
- View dashboard statistics
As Student:
- Register and login
- Browse available quizzes
- Start a quiz and answer questions
- Submit and view results
- Check leaderboard
- View attempt history
// Logs all HTTP requests
// File: middleware/loggerMiddleware.js
// Output: data/logs.txt// Centralized error handling
// File: middleware/errorMiddleware.js
// Handles validation, database, and server errors// isAuthenticated - Check if logged in
// isAdmin - Check if admin role
// isStudent - Check if student role
// File: middleware/authMiddleware.js{
name: "Admin User",
email: "admin@quizmaster.com",
password: "admin123",
role: "admin"
}{
name: "John Doe",
email: "john@example.com",
password: "student123",
role: "student"
}{
title: "General Knowledge Quiz",
category: "General Knowledge",
difficulty: "Medium",
totalMarks: 50,
timeLimit: 30,
createdBy: ObjectId("admin"),
createdAt: "2024-05-10"
}To add sample data, use MongoDB shell or Compass.
- Clean, professional interface
- Responsive design (mobile-friendly)
- Intuitive navigation
- Consistent color scheme
- Easy-to-read typography
- Primary: #3498db (Blue)
- Secondary: #2ecc71 (Green)
- Danger: #e74c3c (Red)
- Warning: #f39c12 (Orange)
- Navigation bar (sticky)
- Quiz cards with metadata
- Quiz timer with countdown
- Result cards with scores
- Leaderboard table
- Form validations
- Error/success alerts
404 Not Found- Invalid URL403 Forbidden- Insufficient permissions500 Server Error- Server issues
- Empty form fields
- Invalid email format
- Password mismatch
- Duplicate email
- Invalid quiz/question ID
- Connection failures
- Validation errors
- Duplicate key errors
- Invalid object IDs
- Total students count
- Total quizzes count
- Total attempts count
- Average score percentage
- Top performing students
- Attempts per quiz
- Score distribution
Uses MongoDB aggregation pipeline:
// Example: Average score per quiz
db.results.aggregate([
{ $group: { _id: '$quizTitle', avg: { $avg: '$percentage' } } }
])- β MVC architecture followed
- β Async/await for all database operations
- β Error handling with try/catch
- β Input validation on all routes
- β Session-based authentication
- β Middleware for cross-cutting concerns
- β RESTful API design
- β Comments throughout code
- β Modular file structure
- β Separation of concerns
This project demonstrates:
- Node.js core modules (fs, path, events)
- Express.js routing and middleware
- MongoDB CRUD operations
- MongoDB aggregation pipeline
- EJS templating engine
- MVC architecture implementation
- RESTful API design
- Session-based authentication
- Error handling patterns
- Async/await programming
- Event-driven programming
Error: Cannot connect to MongoDB
Solution: Ensure MongoDB is running on port 27017
Error: EADDRINUSE: address already in use :::3000
Solution: Change PORT or kill process using port 3000
Error: Session data not persisting
Solution: Ensure express-session is properly configured
Error: Cannot find views
Solution: Check views path in app.js, ensure EJS is set as engine
For issues or questions:
- Check the logs in
data/logs.txt - Review console error messages
- Check browser console for client-side errors
- Verify MongoDB connection
- Ensure all dependencies are installed
This project is developed for educational purposes as part of a backend development course.
- Email notifications
- Password reset functionality
- Question bank with categories
- Question difficulty analysis
- Performance charts and graphs
- Export results to PDF
- Multi-language support
- Two-factor authentication
- API documentation (Swagger)
β
Node.js asynchronous programming
β
Core Node.js modules (fs, path, events)
β
Express.js routing
β
EJS templates
β
REST APIs
β
Middleware & error handling
β
MongoDB CRUD & Aggregation
β
MVC architecture
β
DTO & Guards (role-based)
β
Manual implementations (no external auth libs)
Created for: Backend Development Course
Created by: Muhammad Afzal Kalwar, Ayesha Bibi, Hafsa Kanwal Awan
Date: May 2024
Version: 1.0.0
