-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
95 lines (76 loc) · 2.31 KB
/
server.js
File metadata and controls
95 lines (76 loc) · 2.31 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
// #Add the .env variable to the environnement variables
require('dotenv').config();
// #Extern dependencies
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const morgan = require('morgan');
const helmet = require('helmet');
const cookieParser = require('cookie-parser');
const forest = require('forest-express-mongoose');
const mongoose = require('mongoose');
const client = require('redis').createClient();
const path = require('path');
// #Intern Tools
const logger = require('./src/Services/logger');
const db = require('./src/Services/db');
// #Routes
const { router } = require('./src');
// #Express
const port = process.env.PORT || 3000;
const app = express();
// #Add limite rate
const limiter = require('express-limiter')(app, client);
limiter({
path: '*',
method: 'all',
lookup: ['connection.remoteAddress'], // controll, add req.user.id
total: 20, // 150 request per
expire: 1000 * 60, // 1 minute
onRateLimited: (req, res, next) => {
logger.info('Rate limited', {
tags: ['limiteRate', 'limiter', 'DDOS'],
});
next({ message: 'Rate limit exceeded', status: 429 });
},
});
// #App initialisation
const init = () => {
// #Mongoose
db.initMongooseClient();
// #ForestAdmin
app.use(forest.init({
modelsDir: './src',
envSecret: process.env.FOREST_ENV_SECRET,
authSecret: process.env.FOREST_AUTH_SECRET,
mongoose, // The mongoose database connection.
}));
// #Use path to add views
app.set('view engine', 'pug');
app.set('views', path.join(__dirname, 'views'));
// #CORS
app.use(cors());
// #Body Parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// #Helmet
app.use(helmet());
// others middleware : https://github.com/helmetjs/helmet
// #Logger morgan -> winston
app.use(morgan('dev', { stream: logger.stream }));
// #Cookie parser
app.use(cookieParser());
// API routes
app.use('/', router);
// #Ready to listen
app.listen(port, () => {
// Replace by logger
logger.info(`App is running on port ${port}`, { tags: ['startup', 'init'] });
});
};
init();
// #Handle Uncaught Exception
process.on('uncaughtException', (err) => {
// handle the error safely
logger.error(err, { tags: ['uncaughtException', 'fatal-error'] });
});