-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
90 lines (75 loc) · 2.41 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
var express = require('express');
var swig = require('swig');
var http = require('http');
var fs = require('fs');
var app = express();
app.set('port', process.env.PORT || 3000);
app.use(express.logger('dev'));
app.use(express.bodyParser());
var STUDENT_ROOTS = __dirname + '/www';
var subApps = {};
// Construct a complete express app for each student with swig and static routes
// set correctly, cache it, and return it.
var getSubApp = function(student) {
if (subApps.hasOwnProperty(student)) {
console.log('Returning cached app for %s', student);
return subApps[student];
} else {
console.log('Constructing a new app object for %s', student);
var subApp = express();
subApp.use(express.logger('dev'));
subApp.use(express.bodyParser());
swig.setDefaults({ cache: false });
subApp.use(express.errorHandler());
var HTML_REGEX = /\.html$/;
subApp.all('*', function(req, res, next) {
var reqPath;
if (req.path === '/') {
console.log('path is / changing to index.html');
reqPath = '/index.html';
} else {
reqPath = req.path;
}
if (HTML_REGEX.test(reqPath)) {
var fullPath = STUDENT_ROOTS + '/' + student + reqPath;
fs.exists(fullPath, function(exists) {
if (exists) {
console.log('%s exists, calling render', fullPath);
swig.renderFile(fullPath, {}, function(err, output) {
if (err) {
res.send('Error rendering template: ' + err);
} else {
res.send(output);
}
});
} else {
console.log('No such file %s', fullPath);
next();
}
});
} else {
console.log('%s is not an html file, calling next', reqPath);
next();
}
});
subApp.use(express.static(STUDENT_ROOTS + '/' + student));
subApps[student] = subApp;
return subApp;
}
};
app.all('/*', function(req, res, next) {
var sub = req.subdomains;
if (sub.length <= 1) {
next(new Error('No subdomain: ' + req.host));
} else if (sub.length > 2) {
next(new Error('Too many subdomains: ' + req.host));
} else {
var student = sub.pop();
var sApp = getSubApp(student);
sApp(req, res);
}
});
app.use(express.errorHandler());
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});