-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
128 lines (105 loc) · 3.29 KB
/
Copy pathserver.js
File metadata and controls
128 lines (105 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
const express = require('express')
const path = require('path')
const dotenv = require('dotenv')
const morgan = require('morgan')
const cookieParser = require('cookie-parser')
const cors = require('cors')
const fileupload = require('express-fileupload')
const mongoSanitize = require('express-mongo-sanitize')
const xss = require('xss-clean')
const helment = require('helmet')
const hpp = require('hpp')
const rateLimit = require('express-rate-limit')
require('colors')
const connectDB = require('./config/db')
const globalErrorHandler = require('./middleware/errorHandler')
const AppError = require('./utils/appError')
// Load env vars
dotenv.config({ path: './config/config.env' })
// Connect to the database
connectDB()
const app = express()
// Route files
const bootcampRouter = require('./routes/bootcampRouter')
const courseRouter = require('./routes/courseRouter')
const authRouter = require('./routes/authRouter')
const userRouter = require('./routes/userRouter')
const reviewRouter = require('./routes/reviewRouter')
// Enable CORS
app.use(cors({ credentials: true }))
// JSON body parser middleware
app.use((req, res, next) => {
express.json()(req, res, (err) => {
// Handle error in case of JSON parsing issues
if (
err &&
err instanceof SyntaxError &&
err.status === 400 &&
err.type === 'entity.parse.failed'
) {
return next(new AppError(`Invalid JSON format: ${err.message}`, 400))
}
return next()
})
})
// Cookie Parser
app.use(cookieParser())
// File upload
app.use(fileupload())
// Sanatize Data (Against NoSQL injection)
app.use(mongoSanitize())
// Sanitize Data (Agains XSS attack)
app.use(xss())
// Set extra security headers
app.use(helment())
// Protection against HTTP Parameter Pollution attacks
app.use(hpp())
// Rate limiting
const limiter = rateLimit({
windowMs: 10 * 60 * 1000, // 10 mins
max: 200,
message: {
sucess: false,
data: { msg: 'Too many requests, please try again later.' }
}
})
// apply to all requests
app.use(limiter)
// Logging middleware (Only in Dev environment)
if (process.env.NODE_ENV === 'development') {
app.use(morgan('dev'))
}
// Set static folder
app.use(express.static(path.join(__dirname, 'public')))
// Mount routes
app.get('/', (req, res, next) => {
res.send('Server is running & API is working')
})
app.use('/api/v1/bootcamps', bootcampRouter)
app.use('/api/v1/courses', courseRouter)
app.use('/api/v1/auth', authRouter)
app.use('/api/v1/users', userRouter)
app.use('/api/v1/reviews', reviewRouter)
// Error Handler middleware
app.use(globalErrorHandler)
const PORT = process.env.PORT || 3004
const server = app.listen(
PORT,
console.log(
`Server is running in ${process.env.NODE_ENV} mode on port ${PORT}`.blue
)
)
// Handle "Unhandled promise rejections"
process.on('unhandledRejection', (err, promise) => {
console.log(`${err.name}: ${err.message}`.red)
console.log('Unhandled Rejection! Sutting down...'.red)
// Close server and exit process (1: with failure)
server.close(() => process.exit(1))
})
// Handle "Uncaught Exceptions" errors
process.on('uncaughtException', (err, promise) => {
console.log(`${err.name}: ${err.message}`.red)
console.log('ncaught Exceptions! Sutting down...'.red)
// Close server and exit process (1: with failure)
server.close(() => process.exit(1))
})