Складність: Середня
Мета: Створити простий HTTP сервер на Node.js з використанням вбудованого модуля http, без додаткових фреймворків, який демонструє основні принципи роботи з HTTP у Node.js.
-
Налаштування проекту:
- Ініціалізуйте новий 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
- Ініціалізуйте новий Node.js проект:
-
Структура проекту:
- Створіть наступну структуру каталогів та файлів:
node-http-server/ ├── src/ │ ├── config/ # Конфігурація │ ├── controllers/ # Контролери │ ├── models/ # Моделі даних │ ├── routes/ # Маршрутизація │ ├── middleware/ # Middleware │ ├── utils/ # Утиліти │ ├── views/ # Шаблони │ └── server.mjs # Сервер ├── index.mjs # Точка входу ├── .env # Змінні середовища ├── package.json # Залежності та скрипти └── README.md # Документація
- Створіть наступну структуру каталогів та файлів:
-
Основні файли та компоненти:
-
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
-
-
Реалізація функціональності:
-
Маршрутизація:
- Обробка GET запитів для відображення сторінок
- Обробка POST запитів для створення нових завдань
- Логування HTTP методу та URL всіх запитів
-
Контролери:
- Створіть функцію для отримання списку завдань (getTodos)
- Створіть функцію для додавання нового завдання (createTodo)
- Реалізуйте відображення сторінок з різними типами контенту (HTML, текст, JSON)
-
Середній шар (Middleware):
- Реалізуйте функцію для обробки помилок (errorHandler)
- Налаштуйте глобальні обробники для необроблених помилок та відхилених промісів
-
Утиліти:
- Функції для парсингу тіла запиту (parseBody)
- Функції для роботи з шаблонами (readTemplate, replaceTemplate)
- Функції для логування (log, error)
-
-
Запуск та тестування:
- Запустіть сервер у режимі розробки:
npm run dev
- Перевірте роботу всіх ендпоінтів:
- GET / - головна сторінка
- GET /text - текстова відповідь
- GET /json - JSON відповідь
- GET /todos - список завдань
- POST /todos - додавання нового завдання
- GET /form - форма для додавання завдання
- Запустіть сервер у режимі розробки:
-
Розширення функціональності:
- Додайте можливість видалення та оновлення завдань (DELETE та PUT запити)
- Реалізуйте валідацію вхідних даних
- Додайте фільтрацію та пагінацію для списку завдань
-
Покращення архітектури:
- Впровадіть більш гнучку систему маршрутизації
- Реалізуйте повноцінний шаблонізатор для генерації HTML
- Додайте систему логування з різними рівнями (info, warn, error, debug)
-
Збереження даних:
- Реалізуйте збереження завдань у файл
- Додайте взаємодію з базою даних (MongoDB, SQLite, MySQL)
-
Структура проекту:
- Код організовано відповідно до вказаної структури
- Дотримано принципів модульності та розділення відповідальності
-
Функціональність:
- Сервер успішно запускається та обробляє запити
- Всі маршрути працюють коректно
- Реалізовано обробку помилок
-
Якість коду:
- Код читабельний та добре документований
- Використано сучасні можливості JavaScript (ES6+)
- Асинхронні операції оброблено належним чином (async/await)
-
Додаткові функції:
- Реалізація додаткових завдань буде плюсом
- Використовуйте асинхронні функції (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 # Документація