-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
97 lines (86 loc) · 2.48 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
import { getDogs, getDog } from './src/js/fetch.js';
import { Dog } from './src/js/dog-class.js';
import * as http from 'http';
import * as path from 'path';
import * as fs from 'fs';
import * as ejs from 'ejs';
import { fileURLToPath } from 'url';
const { PORT=process.env.PORT||3000, LOCAL_ADDRESS='0.0.0.0' } = process.env
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const fileTypes = {
css: 'text/css',
js: 'text/javascript',
ejs: 'text/javascript',
svg: 'image/svg+xml',
ico: "image/x-icon",
};
let dogList = {};
const dogs = await getDogs();
for (const mainBreed of Object.keys(dogs)) {
const dog = new Dog(mainBreed, dogs[mainBreed]);
await dog.getAssets(200);
dogList[mainBreed] = dog;
}
const dogPageMatches = (url) => {
const match = url.match(/\/dogs\/([a-zA-Z ]+)\/*([a-zA-Z ]*)/);
if (!match) {
return false;
}
return {
breed: match[1] === '' ? null : match[1],
subBreed: match[2] === '' ? null : match[2]
};
};
function processURL(url) {
if (url === '/') {
return { file: 'home.ejs', data: { url: url, dogs: dogList, breed: null }, status: 200 };
}
if (url === '/dogs') {
return { file: 'all-dogs.ejs', data: { url: url, dogs: dogList, breed: null }, status: 200 };
}
const matches = dogPageMatches(url);
if (matches) {
if (dogList[matches.breed] !== undefined) {
return { file: 'dog.ejs', data: { url: url, breed: matches.breed, dog: dogList[matches.breed], subBreed: matches.subBreed }, status: 200 };
}
}
return { file: '404.ejs', data: {}, status: 404 };
}
function serveFile(url, res) {
const ext = path.extname(url).slice(1);
const contentType = fileTypes[ext];
if (!contentType) {
console.log(`unsupported: ${ext}`);
return;
}
res.writeHead(200, { 'Content-type': contentType });
fs.readFile(`${__dirname}/src/${ext}/${path.basename(url)}`, 'utf8', function (err, data) {
if (err) throw err;
res.end(data);
});
}
function renderEJS(url, res) {
const { file, data, status } = processURL(url);
ejs.renderFile(`${__dirname}/src/ejs/${file}`, data, function (err, html) {
if (err) throw err;
res.statusCode = status;
res.write(html);
});
}
const server = http.createServer();
server.on('request', async (req, res) => {
const { url } = req;
req.on('error', (err) => {
console.log(err);
});
if (path.extname(url)) {
serveFile(url, res);
return;
}
renderEJS(url, res);
res.end();
});
server.listen(PORT, LOCAL_ADDRESS, () => {
console.log(`listening at http://${LOCAL_ADDRESS}:${PORT}`);
});