This repository has been archived by the owner on Jan 5, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathserver.js
64 lines (54 loc) · 1.8 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
#!/usr/bin/env node
const favicon = require('serve-favicon');
const fs = require('fs');
const path = require('path');
const express = require('express');
const onDeath = require('death')({SIGHUP: true});
const acceptLanguageParser = require('accept-language-parser');
const resolve = (file) => path.resolve(__dirname, file);
const renderer = require('vue-server-renderer')
.createBundleRenderer(require('./vue-ssr-bundle.json'), {
runInNewContext: false,
template: fs.readFileSync(
resolve('./index.server.html'), 'utf-8'
),
});
const app = express();
app.use(favicon(resolve('./public/img/logo.png')));
app.use(express.static('./public', {
index: false,
}));
app.get('*', (req, res) => {
let acceptLanguages = [];
for (
let lang of acceptLanguageParser.parse(req.headers['accept-language'])
) {
acceptLanguages.push(lang.code);
}
res.setHeader('Content-Type', 'text/html');
const context = {url: req.url, accept_languages: acceptLanguages};
renderer.renderToString(context, (error, html) => {
if (error) {
switch (error.code) {
case 404:
res.status(404).end('404 | Page Not Found');
break;
case 500:
res.status(500).end('500 | Internal Server Error');
break;
default:
res.end('Unknown server error');
}
console.error(`Error during render "${req.url}": ${error.message}`);
return;
}
const {title, meta} = context.meta.inject();
html = html.replace('#{metaInfo}', title.text() + meta.text());
res.end(html);
});
});
app.listen(8080);
onDeath(function(signal) {
console.log(`Received "${signal}" signal`);
process.exit();
});