-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
125 lines (102 loc) · 3.12 KB
/
server.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
var express = require('express');
var path = require('path');
var http = require('http');
var _ = require('lodash');
var compression = require('compression');
var morgan = require('morgan');
var serveStatic = require('serve-static');
var errorhandler = require('errorhandler');
var methodOverride = require('method-override');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var csurf = require('csurf');
var config = require('./config/local');
var COOKIE_SECRET = 'cjdehrenmj43kife3r3';
var SESSION_SECRET = 'kdwnksjwlp9812,;xd';
exports = module.exports = function(options) {
var app = express();
var env = app.get('env');
var PRODUCTION = env === 'production';
app.use(errorhandler({
dumpExceptions: !PRODUCTION,
showStack: !PRODUCTION
}));
options = _.extend({
log: true,
csrf: true
}, options);
// Configuration
app.locals.config = config;
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('ejs', require('ejs').renderFile);
if (PRODUCTION) {
app.enable('view cache');
}
// Body parser
app.use(bodyParser.json({
limit: '50mb'
}));
app.use(bodyParser.urlencoded({
limit: '50mb',
extended: false
}));
// Method override
app.use(methodOverride('_method'));
// Logger
if (options.log) {
var logFormat = typeof options.log === 'string' ? options.log : 'dev';
app.use(morgan(logFormat));
}
// Serve static files
app.use(serveStatic(path.join(__dirname, 'views'), {
maxAge: 1000 * 60 * 60 * 24 // 1 day
}));
// Compression
app.use(compression());
// Cookie parser
app.use(cookieParser(COOKIE_SECRET));
// Session
app.use(session({
store: new RedisStore(config.session.redis),
secret: SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 30 // 30 days
}
}));
// CSRF
if (options.csrf) {
app.use(csurf());
app.use(function(req, res, next) {
if (req.session.isLogin && req.cookies.ca !== 'true') {
res.cookie('ca', 'true');
} else if (!req.session.isLogin && req.cookies.ca) {
res.clearCookie('ca');
}
res.cookie('XSRF-TOKEN', req.csrfToken());
next();
});
// CSRF error handler
app.use(function(err, req, res, next) {
if (err.code !== 'EBADCSRFTOKEN') {
return next(err);
}
// handle CSRF token errors here
res.status(403);
res.send('CSRF token invalid');
});
}
// Register routes
require('./routes')(app);
return app;
};
exports.server = function(options) {
var app = exports(options);
http.createServer(app).listen(config.port, function() {
console.log('Server listening at %s:%s', 'localhost', config.port);
});
};