-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
150 lines (130 loc) · 3.95 KB
/
app.js
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
const path = require('path');
const express = require('express');
const morgan = require('morgan');
const rateLimit = require('express-rate-limit');
const helmet = require('helmet');
const mongoSanitize = require('express-mongo-sanitize');
const xss = require('xss-clean');
const hpp = require('hpp');
const cookieParser = require('cookie-parser');
const AppError = require('./utils/appError');
const globalErrorHandler = require('./controllers/errorController');
const tourRouter = require('./routes/tourRoutes');
const userRouter = require('./routes/userRoutes');
const reviewRouter = require('./routes/reviewRoutes');
const viewRouter = require('./routes/viewRoutes');
const bookingRouter = require('./routes/bookingRoutes');
const app = express();
// Setting template engine
app.set('view engine', 'pug');
app.set('views', path.join(__dirname, 'views'));
// GLOBAL MIDDLEWARES
// Serving static files
app.use(express.static(path.join(__dirname, 'public')));
// Set security HTTP headers
app.use(
helmet({
crossOriginEmbedderPolicy: false,
})
);
// Further HELMET configuration for Security Policy (CSP)
const scriptSrcUrls = [
'https://unpkg.com/',
'https://tile.openstreetmap.org',
'https://js.stripe.com/',
];
const styleSrcUrls = [
'https://unpkg.com/',
'https://tile.openstreetmap.org',
'https://fonts.googleapis.com/',
];
const connectSrcUrls = [
'https://unpkg.com',
'https://tile.openstreetmap.org',
'https://*.stripe.com/',
];
const fontSrcUrls = ['fonts.googleapis.com', 'fonts.gstatic.com'];
app.use(
helmet.contentSecurityPolicy({
directives: {
defaultSrc: [],
connectSrc: ["'self'", ...connectSrcUrls],
scriptSrc: ["'self'", ...scriptSrcUrls],
styleSrc: ["'self'", "'unsafe-inline'", ...styleSrcUrls],
workerSrc: ["'self'", 'blob:'],
objectSrc: [],
imgSrc: ["'self'", 'blob:', 'data:', 'https:'],
fontSrc: ["'self'", ...fontSrcUrls],
frameSrc: [
'self',
'unsafe-inline',
'data:',
'blob:',
'https://*.stripe.com',
'https://*.cloudflare.com/',
'https://bundle.js:*',
'ws://localhost:*/',
],
},
})
);
// Development logging
if (process.env.NODE_ENV === 'development') {
app.use(morgan('dev')); // display the info about the request in the console
}
const limiter = rateLimit({
max: 100,
windowMs: 60 * 60 * 1000,
message: 'Too many requests from this IP, please try again in an hour!',
});
//Limit requests from the same API
app.use('/api', limiter);
// Body parser, reading data from body into req.body
app.use(
express.json({
limit: '10kb', // limit the req body
})
); // a middleware used to modify body of request
app.use(express.urlencoded({ extended: true, limit: '10kb' }));
app.use(cookieParser());
// Data sanitization against NoSQL query injection
app.use(mongoSanitize());
// Data sanitization against XSS
app.use(xss());
// Prevent parameter pollution
app.use(
hpp({
whitelist: [
'duration',
'ratingsAverage',
'ratingsQuantity',
'maxGroupSize',
'difficulty',
'price',
],
})
);
// Test middleware
app.use((req, res, next) => {
req.requestTime = new Date().toISOString();
// console.log(req.cookies);
next();
});
// app.get('/api/v1/tours', getAllTours);
// app.get('/api/v1/tours/:id', getTour);
// app.post('/api/v1/tours', createTour);
// app.patch('/api/v1/tours/:id', updateTour);
// app.delete('/api/v1/tours/:id', deleteTour);
// ROUTES
app.use('/', viewRouter);
app.use('/api/v1/tours', tourRouter);
app.use('/api/v1/users', userRouter);
app.use('/api/v1/reviews', reviewRouter);
app.use('/api/v1/bookings', bookingRouter);
// HANDLING UNHANDLED ROUTES
app.all('*', (req, res, next) => {
next(new AppError(`Can't find ${req.originalUrl} on this server!`, 404)); // this next(err) will skip all the middleware in the stack, then send error to the error handling middleware
});
// GLOBAL ERROR HANDLING MIDDLEWARE
app.use(globalErrorHandler);
module.exports = app;