-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
153 lines (126 loc) · 4.02 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
151
152
153
var express = require('express');
var nunjucks = require('nunjucks');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var sassMiddleware = require('node-sass-middleware');
var router = require('./routes/router');
var session = require('express-session');
var crypto = require('crypto');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.use('/nhsuk-frontend', express.static(path.join(__dirname, '/node_modules/nhsuk-frontend/packages')));
var appViews = [
path.join(__dirname, 'node_modules/nhsuk-frontend/packages/components'),
path.join(__dirname, 'views')
]
// Setup nunjucks templating engine
nunjucks.configure(appViews, {
autoescape: true,
noCache: true,
watch: true,
express: app
});
app.set('view engine', 'html');
// Serve static files from '/static' as pure HTML
app.use('/static', express.static('static'));
// Force HTTPS on production. Do this before using basicAuth to avoid
// asking for username/password twice (for `http`, then `https`).
var env = process.env.NODE_ENV || 'development';
var isSecure = (env === 'production' && useHttps === 'true')
if (isSecure) {
app.use(forceHttps)
app.set('trust proxy', 1) // needed for secure cookies on heroku
}
// Support session data
app.use(session({
cookie: {
maxAge: 1000 * 60 * 60 * 1, // 1 hour
},
// use random name to avoid clashes with other prototypes
name: 'kit-' + crypto.randomBytes(64).toString('hex'),
resave: false,
saveUninitialized: false,
secret: crypto.randomBytes(64).toString('hex')
}));
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(sassMiddleware({
src: path.join(__dirname, 'public'),
dest: path.join(__dirname, 'public'),
indentedSyntax: false, // true = .sass and false = .scss
sourceMap: true
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', router);
app.use('/home', router);
// Redirect HTTP requests to HTTPS
forceHttps = function (req, res, next) {
if (req.headers['x-forwarded-proto'] !== 'https') {
console.log('Redirecting request to https')
// 302 temporary - this is a feature that can be disabled
return res.redirect(302, 'https://' + req.get('Host') + req.url)
}
next()
}
// Store data from POST body or GET query in session
var storeData = function (input, store) {
for (var i in input) {
// any input where the name starts with _ is ignored
if (i.indexOf('_') === 0) {
continue
}
var val = input[i]
// Delete values when users unselect checkboxes
if (val === '_unchecked' || val === ['_unchecked']) {
delete store.data[i]
continue
}
// Remove _unchecked from arrays of checkboxes
if (Array.isArray(val)) {
var index = val.indexOf('_unchecked')
if (index !== -1) {
val.splice(index, 1)
}
}
store.data[i] = val
}
}
// Middleware - store any data sent in session, and pass it to all views
autoStoreData = function (req, res, next) {
if (!req.session.data) {
req.session.data = {}
}
storeData(req.body, req.session)
storeData(req.query, req.session)
// Send session data to all views
res.locals.data = {}
for (var j in req.session.data) {
res.locals.data[j] = req.session.data[j]
}
next()
}
app.use(autoStoreData)
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;