Проблема в том, что стандартного роутинга (как в nginx или apache) в NodeJS нет, его необходимо запрограммировать. То есть если ввести в адресной строке браузера ссылку на изображение, то страница начнёт бесконечно загружаться:
https://адрес_сайта.ru/img.png
Потому что в нашем коде ещё не запрограммирована отдача страницы с "Content-Type" равным "image/png". Аналогично и с CSS и JavaScript файлами, которые подключаются для работы в браузере пользователя. Поэтому вспомним код нашего приложения:
let http = require('http');
let fs = require('fs');
http.createServer(function(request, response) {
fs.readFile('pages/' + request.url, (error, fileContent) => {
response.setHeader('Content-Type' : 'text/html');
if (!error) { // страница существует
response.statusCode = 200;
response.write(fileContent);
response.end();
} else { // страница не найдена
fs.readFile('pages/404.html', (error404, fileContent404) => {
if(error404) throw error404;
response.statusCode = 404;
response.write(fileContent404);
response.end();
});
}
});
}).listen(80);
Приступим к модификации JS кода приложения. Основная проблема в том, что при запросе к файлу на него выдаётся один и тот же "Content-Type" равный "text/html". Запрограммируем изменение этого заголовка в зависимости от выдаваемого файла с помощью метода "endsWith", который определяет есть ли в конце строки искомая фраза. Получится так:
let http = require('http');
let fs = require('fs');
http.createServer(function(request, response) {
fs.readFile('pages/' + request.url, (error, fileContent) => {
let contentType = 'text/html';
if (request.url.endsWith('.css')) contentType = 'text/css';
if (request.url.endsWith('.js')) contentType = 'text/javascript';
if (request.url.endsWith('.png')) contentType = 'image/png';
response.setHeader('Content-Type' : contentType);
if (!error) { // страница существует
response.statusCode = 200;
response.write(fileContent);
response.end();
} else { // страница не найдена
fs.readFile('pages/404.html', (error404, fileContent404) => {
if(error404) throw error404;
response.statusCode = 404;
response.write(fileContent404);
response.end();
});
}
});
}).listen(80);
Остаётся только прописать подключение JS, CSS и файлов изображений в HTML коде страниц. Помимо перечисленных в примере "MIME"-типов для изображений можно добавить следующие: