Здесь App.js < /p>
/**
* Bugema University Vocational Training School Electronic Records Management System
* Main application entry point
*/
// Import required modules
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const compression = require('compression');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoStore = require('connect-mongo');
const helmet = require('helmet');
const cors = require('cors');
const flash = require('connect-flash');
const mongoose = require('mongoose');
const expressLayouts = require('express-ejs-layouts');
// Import custom modules
const env = require('./config/env');
const { connectToDatabase } = require('./config/database');
const { securityHeaders } = require('./config/security');
const logger = require('./utils/logger');
const { notFoundHandler, errorHandler } = require('./utils/errorHandler');
// Create Express application
const app = express();
// Set up view engine and views directory
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
// Set up express layouts
app.use(expressLayouts);
app.set('layout', 'layouts/main');
console.log('Step 1: Starting app.js execution...');
// Database connection and server startup
connectToDatabase()
.then(() => {
logger.info('MongoDB Atlas connection established successfully');
// Start server after successful database connection
const PORT = env.port || 3000;
console.log('Attempting to start the server...');
const server = app.listen(PORT, '0.0.0.0', function(err) {
if (err) {
console.error('ERROR STARTING SERVER:', err);
process.exit(1);
}
const serverInfo = server.address();
console.log('\n\n==========================================================');
console.log(`*** SERVER STARTED SUCCESSFULLY ***`);
console.log(`
console.log('==========================================================\n');
});
})
.catch((err) => {
logger.error(`Failed to connect to MongoDB Atlas: ${err.message}`);
process.exit(1);
});
// Security middleware
app.use(helmet({
contentSecurityPolicy: securityHeaders.contentSecurityPolicy,
xContentTypeOptions: true,
xFrameOptions: securityHeaders.xFrameOptions,
xXssProtection: true,
hsts: env.isProd ? securityHeaders.hsts : false,
referrerPolicy: securityHeaders.referrerPolicy,
}));
console.log('Middleware setup complete.');
// Request parsing middleware
app.use(express.json({ limit: '1mb' }));
app.use(express.urlencoded({ extended: true, limit: '1mb' }));
// Cookie parser middleware
app.use(cookieParser(env.sessionSecret));
// Server-side session configuration
app.use(session({
secret: env.sessionSecret,
resave: false,
saveUninitialized: false,
store: process.env.SKIP_DB_CONNECT === 'true' ? undefined : MongoStore.create({
mongoUrl: env.mongodbUri,
ttl: 14 * 24 * 60 * 60,
autoRemove: 'native',
collectionName: 'sessions',
crypto: {
secret: env.sessionSecret,
},
}),
cookie: {
httpOnly: true,
secure: env.isProd,
sameSite: 'strict',
maxAge: 14 * 24 * 60 * 60 * 1000,
},
}));
// Verify session is being tracked
if (!env.isProd) {
app.use((req, res, next) => {
console.log('
next();
});
}
// Flash messages middleware
app.use(flash());
// Cross-Origin Resource Sharing
app.use(cors({
origin: env.isProd ? 'https://erms.bugema.ac.ug' : true,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true,
}));
// HTTP request logging
app.use(morgan(env.isProd ? 'combined' : 'dev', { stream: logger.stream }));
// Compression middleware
app.use(compression());
// Serve static files
app.use(express.static(path.join(__dirname, 'public')));
// Custom middleware to make some variables available to all templates
app.use((req, res, next) => {
res.locals.user = req.session.user || null;
res.locals.flashMessages = req.flash();
res.locals.currentPath = req.path;
res.locals.appName = 'Bugema ERMS';
res.locals.year = new Date().getFullYear();
next();
});
// Import routes
const authRoutes = require('./routes/auth');
const authWebRoutes = require('./routes/auth-web');
const studentRoutes = require('./routes/students');
const programRoutes = require('./routes/programs');
const courseRoutes = require('./routes/courses');
const enrollmentRoutes = require('./routes/enrollments');
const assessmentRoutes = require('./routes/assessments');
const paymentRoutes = require('./routes/payments');
const documentRoutes = require('./routes/documents');
const reportRoutes = require('./routes/reports');
const adminRoutes = require('./routes/admin');
const registrarRoutes = require('./routes/registrar');
const financeRoutes = require('./routes/finance');
const userRoutes = require('./routes/users');
const dashboardRoutes = require('./routes/dashboard');
// API routes
app.use('/api/auth', authRoutes);
app.use('/api/students', studentRoutes);
app.use('/api/programs', programRoutes);
app.use('/api/courses', courseRoutes);
app.use('/api/enrollments', enrollmentRoutes);
app.use('/api/assessments', assessmentRoutes);
app.use('/api/payments', paymentRoutes);
app.use('/api/documents', documentRoutes);
app.use('/api/reports', reportRoutes);
app.use('/api/users', userRoutes);
// Web routes
app.use('/auth', authWebRoutes);
app.use('/admin', adminRoutes);
app.use('/registrar', registrarRoutes);
app.use('/finance', financeRoutes);
app.use('/dashboard', dashboardRoutes);
console.log('Routes registered.');
// Root route - redirect to login or dashboard
app.get('/', (req, res) => {
console.log('
if (req.session.user) {
const role = req.session.user.role;
switch (role) {
case 'admin':
return res.redirect('/admin/dashboard');
case 'registrar':
return res.redirect('/registrar/dashboard');
case 'finance':
return res.redirect('/finance/dashboard');
case 'student':
return res.redirect('/dashboard');
default:
return res.redirect('/auth/login');
}
} else {
console.log('
res.redirect('/auth/login');
}
});
// Error handling middleware
app.use(notFoundHandler);
app.use(errorHandler);
// Handle uncaught exceptions
process.on('uncaughtException', (err) => {
logger.error('UNCAUGHT EXCEPTION!
logger.error(`${err.name}: ${err.message}`, { stack: err.stack });
process.exit(1);
});
// Handle unhandled promise rejections
process.on('unhandledRejection', (err) => {
logger.error('UNHANDLED REJECTION!
logger.error(`${err.name}: ${err.message}`, { stack: err.stack });
process.exit(1);
});
// Check for required environment variables
if (!env.port || !env.mongodbUri || !env.jwtSecret) {
console.error('Missing required environment variables. Please check your configuration.');
process.exit(1);
}
module.exports = app;
< /code>
Gere, когда я запускаю "NPM запустить dev" или "app.js.js" < /p>
snow@snow:~/Documents/ERMS$ npm install
npm warn deprecated [email protected]: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated [email protected]: Glob versions prior to v9 are no longer supported
added 534 packages, and audited 535 packages in 1m
60 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
snow@snow:~/Documents/ERMS$ npm run dev
> [email protected] dev
> nodemon app.js
[nodemon] 3.1.10
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node app.js`
Step 1: Starting app.js execution...
2025-05-18 19:33:12 info: Attempting to connect to MongoDB at cluster0.wcahcli.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0
Middleware setup complete.
(node:263625) [MONGOOSE] Warning: Duplicate schema index on {"studentId":1} found. This is often due to declaring an index using both "index: true" and "schema.index()". Please remove the duplicate index definition.
(Use `node --trace-warnings ...` to show where the warning was created)
2025-05-18 19:33:15 info: Successfully connected to MongoDB Atlas
2025-05-18 19:33:15 info: MongoDB Atlas connection established successfully
Attempting to start the server...
==========================================================
*** SERVER STARTED SUCCESSFULLY ***
==========================================================
cookie: {
path: '/',
_expires: 2025-05-31T07:25:36.990Z,
originalMaxAge: 1209600000,
httpOnly: true,
secure: false,
sameSite: 'strict'
},
flash: {}
}
2025-05-18 19:33:18 info: GET / 404 1.769 ms - 139
< /code>
Я ожидаю, когда я запускаю «NPM Run Dev», и я перейду по ссылке. Я должен увидеть страницу входа в систему. Но когда я получаю доступ к странице. Я получаю ошибку сервера. Я перепробовал все, но я думаю, что они потерпели неудачу.
Подробнее здесь: https://stackoverflow.com/questions/796 ... w-the-link