Skip to content

Latest commit

 

History

History
236 lines (181 loc) · 11.7 KB

TASK.md

File metadata and controls

236 lines (181 loc) · 11.7 KB

Node.js HTTP Server

Складність: Середня

Мета: Створити простий HTTP сервер на Node.js з використанням вбудованого модуля http, без додаткових фреймворків, який демонструє основні принципи роботи з HTTP у Node.js.


Постановка задачі:

  1. Налаштування проекту:

    • Ініціалізуйте новий Node.js проект:
      yarn init -y
      # або
      npm init -y
    • Встановіть необхідні залежності:
      yarn add dotenv
      yarn add -D nodemon
      # або
      npm install dotenv
      npm install -D nodemon
    • Налаштуйте скрипти в package.json:
      "scripts": {
        "start": "node index.mjs",
        "dev": "nodemon index.mjs"
      }
    • Створіть файл .env для конфігурації (цей файл не зберігається в репозиторії, його потрібно створити вручну):
      PORT=3000
      HOST=localhost
      
  2. Структура проекту:

    • Створіть наступну структуру каталогів та файлів:
      node-http-server/
      ├── src/
      │   ├── config/           # Конфігурація
      │   ├── controllers/      # Контролери
      │   ├── models/           # Моделі даних
      │   ├── routes/           # Маршрутизація
      │   ├── middleware/       # Middleware
      │   ├── utils/            # Утиліти
      │   ├── views/            # Шаблони
      │   └── server.mjs        # Сервер
      ├── index.mjs             # Точка входу
      ├── .env                  # Змінні середовища
      ├── package.json          # Залежності та скрипти
      └── README.md             # Документація
      
  3. Основні файли та компоненти:

    • index.mjs - головний файл для запуску сервера:

      import './src/server.mjs'
    • src/server.mjs - налаштування HTTP сервера з обробкою запитів та сигналів завершення:

      • Імпортуйте модуль http
      • Створіть сервер, що слухає порт та хост з конфігурації
      • Налаштуйте обробники для сигналів SIGTERM і SIGINT
      • Імпортуйте та використайте функцію handleRequest з router.mjs для обробки запитів
      • Імпортуйте функцію setupGlobalErrorHandlers для налаштування глобальних обробників помилок
      • Викличте initFormTemplate для ініціалізації шаблону форми
    • src/config/index.mjs - конфігурація сервера та шляхів до файлів:

      • Використайте dotenv для завантаження змінних з .env
      • Визначте порт, хост та шляхи до шаблонів (TEMPLATES_DIR, FORM_TEMPLATE)
    • src/routes/router.mjs - маршрутизація запитів:

      • Створіть функцію handleRequest для обробки запитів
      • Реалізуйте маршрутизацію для різних URL та HTTP методів:
        • GET / - головна сторінка
        • GET /text - текстова сторінка
        • GET /json - JSON відповідь з todos
        • GET /todos - сторінка зі списком todos
        • GET /form - сторінка з формою
        • POST /todos - додавання нового todo
    • src/controllers/ - контролери для обробки різних типів запитів:

      • pageController.mjs - для відображення HTML сторінок (getHomePage, getTextPage, getNotFoundPage)
      • todoController.mjs - для операцій з завданнями (getTodos, getTodosJSON, createTodo)
      • formController.mjs - для роботи з формами (getForm, initFormTemplate)
    • src/middleware/errorHandlers.mjs - глобальна обробка помилок:

      • Створіть функцію errorHandler для обробки помилок під час запитів
      • Реалізуйте функцію setupGlobalErrorHandlers для налаштування глобальних обробників помилок
    • src/utils/ - утиліти:

      • logger.mjs - для логування (log, error)
      • templates.mjs - для роботи з шаблонами (readTemplate, replaceTemplate)
      • request.mjs - для обробки тіла запиту (parseBody)
    • src/views/form.html - HTML шаблон для форми з полями для додавання нового todo

  4. Реалізація функціональності:

    • Маршрутизація:

      • Обробка GET запитів для відображення сторінок
      • Обробка POST запитів для створення нових завдань
      • Логування HTTP методу та URL всіх запитів
    • Контролери:

      • Створіть функцію для отримання списку завдань (getTodos)
      • Створіть функцію для додавання нового завдання (createTodo)
      • Реалізуйте відображення сторінок з різними типами контенту (HTML, текст, JSON)
    • Середній шар (Middleware):

      • Реалізуйте функцію для обробки помилок (errorHandler)
      • Налаштуйте глобальні обробники для необроблених помилок та відхилених промісів
    • Утиліти:

      • Функції для парсингу тіла запиту (parseBody)
      • Функції для роботи з шаблонами (readTemplate, replaceTemplate)
      • Функції для логування (log, error)
  5. Запуск та тестування:

    • Запустіть сервер у режимі розробки:
      npm run dev
    • Перевірте роботу всіх ендпоінтів:
      • GET / - головна сторінка
      • GET /text - текстова відповідь
      • GET /json - JSON відповідь
      • GET /todos - список завдань
      • POST /todos - додавання нового завдання
      • GET /form - форма для додавання завдання

Додаткові завдання (необов'язково):

  1. Розширення функціональності:

    • Додайте можливість видалення та оновлення завдань (DELETE та PUT запити)
    • Реалізуйте валідацію вхідних даних
    • Додайте фільтрацію та пагінацію для списку завдань
  2. Покращення архітектури:

    • Впровадіть більш гнучку систему маршрутизації
    • Реалізуйте повноцінний шаблонізатор для генерації HTML
    • Додайте систему логування з різними рівнями (info, warn, error, debug)
  3. Збереження даних:

    • Реалізуйте збереження завдань у файл
    • Додайте взаємодію з базою даних (MongoDB, SQLite, MySQL)

Критерії оцінювання:

  1. Структура проекту:

    • Код організовано відповідно до вказаної структури
    • Дотримано принципів модульності та розділення відповідальності
  2. Функціональність:

    • Сервер успішно запускається та обробляє запити
    • Всі маршрути працюють коректно
    • Реалізовано обробку помилок
  3. Якість коду:

    • Код читабельний та добре документований
    • Використано сучасні можливості JavaScript (ES6+)
    • Асинхронні операції оброблено належним чином (async/await)
  4. Додаткові функції:

    • Реалізація додаткових завдань буде плюсом

Поради:

  • Використовуйте асинхронні функції (async/await) для обробки запитів та файлових операцій
  • Розбивайте код на малі, спеціалізовані функції, кожна з яких відповідає за одну конкретну задачу
  • Для кращої структури коду, групуйте пов'язані функції в окремі модулі
  • Уникайте повторення коду, створюйте утиліти для часто використовуваних функцій
  • Використовуйте константи для зберігання кодів статусу HTTP та заголовків
  • Для ефективної роботи з асинхронним кодом, правильно обробляйте помилки та використовуйте try/catch
  • Тестуйте весь функціонал на різних вхідних даних, включаючи крайові випадки
  • Для зручності розробки, використовуйте API-клієнти (Postman, Insomnia) для тестування вашого API

Приклад структури проекту:

node-http-server/
├── src/
│   ├── config/
│   │   └── index.mjs          # Конфігурація сервера
│   ├── controllers/
│   │   ├── pageController.mjs # Контролер HTML сторінок
│   │   ├── todoController.mjs # Контролер для завдань
│   │   └── formController.mjs # Контролер для форм
│   ├── models/
│   │   └── (порожня тека для майбутніх моделей)
│   ├── routes/
│   │   └── router.mjs         # Маршрутизація запитів
│   ├── middleware/
│   │   └── errorHandler.mjs   # Обробка помилок
│   ├── utils/
│   │   ├── logger.mjs         # Утиліти для логування
│   │   ├── templates.mjs      # Утиліти для шаблонів
│   │   └── request.mjs        # Утиліти для обробки запитів
│   ├── views/
│   │   └── form.html          # HTML шаблон форми
│   └── server.mjs             # HTTP сервер
├── index.mjs                  # Точка входу
├── .env                       # Змінні середовища
├── package.json               # Залежності та скрипти
└── README.md                  # Документація