Простой роутинг в NodeJS

Давайте теперь будем выдавать разное содержимое при обращении к разным URL:

javascripthttp.createServer((request, response) => {
  if (request.url != '/favicon.ico') {
    if (request.url == '/page1') {
      response.writeHead(200, {'Content-Type': 'text/html'});
      response.write('1');
      response.end();
    }
    if (request.url == '/page2') {
      response.writeHead(200, {'Content-Type': 'text/html'});
      response.write('2');
      response.end();
    }
    if (request.url == '/page3') {
      response.writeHead(200, {'Content-Type': 'text/html'});
      response.write('3');
      response.end();
    }
  }
}).listen(3000);

Очевидно, что часть кода у нас дублируется. Давайте его упростим:

javascripthttp.createServer((request, response) => {
  if (request.url != '/favicon.ico') {
    let text;
    
    if (request.url == '/page1') {
      text = '1';
    }
    if (request.url == '/page2') {
      text = '2';
    }
    if (request.url == '/page3') {
      text = '3';
    }
    
    response.writeHead(200, {'Content-Type': 'text/html'});
    response.write(text);
    response.end();
  }
}).listen(3000);

Как вы видите, у нас есть три адреса, доступных для запроса: /page1, /page2 и /page3. Давайте сделаем так, чтобы при обращении к любому другому адресу выдавалось сообщение о том, что страница не найдена:

javascripthttp.createServer((request, response) => {
  if (request.url != '/favicon.ico') {
    let text;
    
    if (request.url == '/page1') {
      text = '1';
    }
    else if (request.url == '/page2') {
      text = '2';
    }
    else if (request.url == '/page3') {
      text = '3';
    } else {
      text = 'page not found';
    }
    
    response.writeHead(200, {'Content-Type': 'text/html'});
    response.end();
  }
}).listen(3000);

Чтобы браузер и поисковые системы правильно обрабатывали отсутствие страницы, мы должны для существующей страницы отдавать статус 200, а для не существующей - 404. Давайте сделаем это:

javascripthttp.createServer((request, response) => {
  if (request.url != '/favicon.ico') {
    let text;
    let status;
    
    if (request.url == '/page1') {
      text = '1';
      status = 200;
    }
    else if (request.url == '/page2') {
      text = '2';
      status = 200;
    }
    else if (request.url == '/page3') {
      text = '3';
      status = 200;
    } else {
      text = 'page not found';
      status = 404;
    }
    
    response.writeHead(status, {'Content-Type': 'text/html'});
    response.end();
  }
}).listen(3000);

Можно упростить код следующим образом:

javascripthttp.createServer((request, response) => {
  if (request.url != '/favicon.ico') {
    let text;
    let status = 200;
    
    if (request.url == '/page1') {
      text = '1';
    }
    else if (request.url == '/page2') {
      text = '2';
    }
    else if (request.url == '/page3') {
      text = '3';
    } else {
      text = 'page not found';
      status = 404;
    }
    
    response.writeHead(status, {'Content-Type': 'text/html'});
    response.end();
  }
}).listen(3000);
Задание 1

Перепишите приведенный код через оператор switch-case.

Задание 2

Дан объект с URL-лами и соответствующими им текстами страниц:

javascriptlet obj = {
  '/page1': '1',
  '/page2': '2',
  '/page3': '3',
}

Сделайте сервер на основе этого объекта. При запросе существующего в объекте адреса отдавайте соответствующий текст, а при запросе отсутствующего - сообщение об ошибке и статус 404.