Роутинг в NodeJS

В предыдущей статье "Объект Request в NodeJS" был разобраны методы для получения и обработки принимаемых от пользователя данных. А в самом конце статье был сделан вывод о том, что приложения на NodeJS отличаются от сайтов на HTML файлах тем, что разбиение сайта на папки (разделы) необходимо программировать, а не просто раскладывать файлы по папкам. Это делается потому, что только один скрипт в NodeJS слушает порт сервера, через который приходят все запросы.

Для организации роутинга по папкам необходимо написать программный код, который определять какую именно страницу запрашивает пользователь. Попробуем модифицировать простейший пример ответа из предыдущей статьи. А чтобы узнать какой именно раздел сайта запрашивается, можно использовать свойство "url" объекта "request". Приведём простейший пример:
let http = require('http');
http.createServer(function(request, response) {
   response.statusCode = 200;
   response.setHeader('Content-Type' : 'text/html');

   if (request.url == '/index.html'){
      response.write('Это титульная страница сайта');
   }
   if (request.url == '/contacts'){
      response.write('Это страница с контактами');
   }

   response.end();
}).listen(80);
Во время запроса к сайту с таким кодом, содержание страницы будет изменяться в зависимости от значения свойства "request.url". Но если совпадения не будет найдено, то появится просто пустая страница. Очевидно, что это неочень хорошее поведение сайта с точки зрения оптимизации его работы для поисковых систем. Лучше добавить функцию, при которой будет выводиться 404 ошибка, если страница не существует. Попробуем это сделать:
let http = require('http');
http.createServer(function(request, response) {
   response.setHeader('Content-Type' : 'text/html');
   
   let statusCode = 200;
   if (request.url == '/index.html'){
      response.write('Это титульная страница сайта');
   } else if (request.url == '/contacts'){
      response.write('Это страница с контактами');
   } else {
      statusCode = 404;
      response.write('Страница не найдена');
   }

   response.statusCode = statusCode;
   response.end();
}).listen(80);
Теперь если страница не будет найдена, то появится ошибка 404.

Роутинг на файлах

Очевидно, что при использовании исполняемой программы такого типа (как NodeJS) можно создать свой собственный пример роутинга. Он может быть как на получаемой от базы данных информации, так и быть похож на традиционную систему роутинга (к примеру, в nginx или apache) из html файлов, разложенных по папкам. Давайте и попробуем реализовать последнюю.

Для создания роутинга на файлах нам необходимо программно считывать содержимое html файлов, разложенных по папкам, а затем передавать пользователю в виде ответа сервера. Для этого воспользуемся модулем "fs" и методом "readFile", который ранее обсуждали в статье "Чтение и запись файлов в NodeJS". Но для начала подготовим сами HTML файлы и разложим по папкам, чтобы получиласт такая структура относительно корня проекта (папки, где лежит файл js):
pages/index.html
pages/404.html
pages/contacts/index.html
pages/products/index.html
pages/products/food/index.html
pages/products/food/cheese/index.html
Реализуем нашу роутинг в JS коде так:
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);
Обратите винмание на метод "readFile". Он является асинхронным (его синхронный аналог "readFileSync"). Поэтому в примере не получится использовать только один метод "response.end". Нужно разделять его как для правильно ответа, так и для ошибки. Иначе в случае ошибки "response.write" будет выполняться после "response.end", что приведёт к аварийному завершению программы.
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, курсы создания сайтов, вебинары по созданию, курсы разработки сайтов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Cмотрите другие статьи:
Была ли статья полезной?
Была ли эта статья полезна? Есть вопрос?
хостинг для сайтов
Закажите недорогой хостинг Заказать

всего от 290 руб

⇡ наверх