-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
74 lines (66 loc) · 2 KB
/
server.js
File metadata and controls
74 lines (66 loc) · 2 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
const express = require('express');
const next = require('next');
const LRUCache = require('lru-cache');
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
const PORT = 3000;
const ssrCache = new LRUCache({
length: function (n, key) {
return n.toString().length + key.toString().length;
},
max: 100 * 1000 * 1000, // 100MB cache soft limit
maxAge: 1000 * 10 // 1000 * 60 * 60 // 1 hour
});
app.prepare()
.then(() => {
const server = express();
server.get('/speaker/:speakerId', (req, res) => {
const actualPage = '/speaker';
const queryParams = { speakerId: req.params.speakerId };
app.render(req, res, actualPage, queryParams);
});
server.get('*', (req, res) => {
if (req.url === "/" ||
req.url === "/speakers" ||
req.url === "/sessions"
) {
return renderAndCache(req, res, req.url, {});
} else {
return handle(req, res);
}
});
server.listen(PORT, (err) => {
if (err) {
throw err;
}
console.log(`Ready on http://localhost:${PORT}`)
})
})
.catch((ex) => {
console.error(ex.stack);
process.exit(1)
});
async function renderAndCache(req, res, pagePath, queryParams) {
const key = getCacheKey(req);
if (ssrCache.has(key)) {
res.setHeader("x-cache", "HIT");
res.send(ssrCache.get(key));
return;
}
try {
const html = await app.renderToHTML(req, res, pagePath, queryParams);
if (res.statusCode !== 200) {
res.send(html);
return;
}
ssrCache.set(key, html);
res.setHeader("x-cache", "MISS");
res.send(html);
} catch (err) {
app.renderError(err, req, res, pagePath, queryParams);
}
}
function getCacheKey(req) {
return `${req.url}`;
}