От скрипта к API (на Windows)
В прошлой лекции (№36) мы написали скрипт, который сам стучался в базу данных. Но настоящие сайты работают иначе. Сайт — это сервер, который ждет команды от пользователя.
API (Application Programming Interface) — это «меню» нашего сервера. Пользователь (через браузер) заказывает блюдо (например, «дай мне список книг»), а сервер приносит результат.
План лекции
Мы построим фундамент для сайта нашей библиотеки.
- 1 Что такое Express и зачем он нужен
- 2 Командная строка Windows (cmd) и навигация
- 3 Установка Express и первый запуск сервера
- 4 Что такое HTTP-запросы (GET, POST)
- 5">Роуты (пути): /books, /readers
- 6 Подключение MS SQL Server к Express
- 7 JSON: язык общения сервера и клиента
- 8 Обработка ошибок 404 и 500
- 9 Запуск: npm start в Windows
- 10 Практика и домашнее задание
Что такое Express?
Express — это веб-фреймворк для Node.js. Это набор готовых функций, которые помогают принимать запросы из интернета и отправлять ответы.
- Node.js — это двигатель (он умеет запускать JS).
- Express — это руль, педали и кузов. Без них двигатель просто шумит на месте.
Установка Express
Откройте Командную строку (cmd) или PowerShell в папке вашего проекта (где лежат файлы из лекции 36) и выполните:
Также нам понадобится morgan — он будет записывать в консоль каждый входящий запрос (очень удобно для отладки).
package.json. Если его нет, создайте его командой npm init -y.Первый сервер (файл server.js)
Создайте файл server.js. Это главная точка входа нашего сайта.
node server.js. Откройте в браузере http://localhost:3000. Вы увидите текст.Что такое HTTP и REST?
HTTP (HyperText Transfer Protocol) — это правила, по которым браузер и сервер общаются.
Просмотр списка книг.
Добавление нового читателя.
Редактирование email.
Удаление записи.
REST — это соглашение о том, как называть адреса (роуты).
Роуты (Маршруты)
Роут — это адрес и функция, которая на него отвечает. Давайте добавим книги.
localhost:3000/books браузер покажет список книг, а по /readers — читателей. Это и есть API.Подключаем базу данных
Нам больше не нужен файл index.js из прошлой лекции. Мы перенесем логику работы с SQL прямо в роуты Express.
Убедитесь, что установлен пакет mssql и есть файл .env с настройками.
Модуль db.js (настройка пула)
Создадим файл db.js, который будет хранить настройки подключения. Это хорошая практика — не писать пароль в главном файле.
.env путь к серверу для Express пишется с ДВОЙНЫМ обратным слэшем: DB_SERVER=localhost\\SQLEXPRESS. Если написать один слэш, Node.js может выдать ошибку.Роут: GET все книги (связка с SQL)
Теперь заставим адрес /books реально ходить в базу данных MS SQL Server. Для этого нам нужно импортировать наш модуль db.js в файл server.js.
localhost:3000/books, вы увидите не текст, а структурированные данные (JSON) со списком книг из вашей таблицы Books.Что такое JSON?
JSON (JavaScript Object Notation) — это текстовый формат обмена данными. Это «язык», на котором сервер и браузер понимают друг друга.
Когда мы пишем res.json(data), Express сам превращает наш массив книг в такую строку и добавляет правильный заголовок Content-Type: application/json.
Роут: GET книга по ID (параметры)
Как показать одну конкретную книгу? Используем двоеточие в адресе — это «параметр маршрута».
localhost:3000/books/5 положит число 5 в переменную req.params.id. Мы ОБЯЗАТЕЛЬНО передаем его через input(), чтобы защититься от SQL-инъекций.Роут: POST новый читатель (тело запроса)
Чтобы добавить данные, клиент (браузер или Postman) присылает их в «теле» запроса. Но Express не умеет читать тело сам — ему нужен специальный «переводчик» express.json().
app.use(express.json()) вверху файла переменная req.body будет пустой (undefined), и вы не сможете прочитать имя и почту читателя.Middleware (Промежуточное ПО)
Middleware — это функции, которые выполняются до нашего роута. Это как конвейер на заводе или фильтры в Instagram.
Мы уже использовали middleware: app.use(morgan) и app.use(express.json()). Они подготавливают запрос для нас.
Роуты в отдельном файле (пример books.js)
Файл server.js становится огромным. Пора разделить его. Хороший проект для Windows выглядит так:
Создаем папку routes и файл books.js внутри неё.
Правила безопасного API
Запомните эти правила — они защитят сервер от взлома.
- Никаких конкатенаций строк в SQL. Только
request.input()и@параметры. - Валидация входящих данных. Если ждете число (ID), проверьте, что это число. Библиотека
express-validatorпоможет. - Ограничение прав. Не все могут удалять книги. Проверяйте права пользователя (middleware авторизации).
- Лимиты (Rate Limiting). Чтобы один пользователь не мог «уронить» сервер тысячей запросов в секунду.
- Заголовки безопасности. Используйте пакет
helmet(он сам настроит правильные заголовки HTTP). - Не отдавайте лишнего. Если в таблице
Readersесть пароль (хэш), не возвращайте его вres.json().
Итоговый server.js (сборка)
Посмотрите, как аккуратно выглядит главный файл после рефакторинга:
Типичные ошибки при запуске в Windows
Порт 3000 занят. Либо старый сервер не выключился (в Диспетчере задач), либо там висит Skype или другой сервис.
Забыли установить пакет (
npm install express) или опечатались в названии папки routes (в Windows важен регистр, если сервер на Linux, но локально в cmd обычно нет, однако в коде путь должен совпадать).Забыли написать
app.use(express.json()) в server.js.Файл
.env не считан или в нем ошибка. Проверьте, что require('dotenv').config() стоит в самом верху db.js.Браузер блокирует запрос, потому что сайт (например, фронтенд на React) и API (наш Node.js) работают на разных портах. Нужен пакет
cors.Тестирование API (Postman / Thunder Client)
Браузер хорошо показывает GET запросы, но для POST и PUT нужны специальные инструменты, где можно писать тело запроса.
- Postman: отдельная программа для тестирования API.
- Thunder Client: расширение для VS Code (самый удобный вариант для студентов, всё под рукой).
localhost:3000/booksJSON в Body
Практический результат
Вот что вы получите в итоге работы сервера.
Самостоятельные задания
Доработайте API «Библиотека».
- Роут
PUT /readers/:id: изменение данных читателя (например, email). Используйтеreq.body. - Роут
DELETE /books/:id: удаление книги (мягкое удаление — поставить в SQL флагIsDeleted = 1). - Поиск: роут
GET /books/search?title=война(используйтеreq.query.titleиWHERE Title LIKE '%' + @title + '%'). - Выдача книги: роут
POST /loans, который принимает{ bookId, readerId }и проверяет в SQL, что книга не занята. - Валидация: добавьте проверку, что в
POST /readersemail выглядит как email (используйте пакетexpress-validator).
PUT и POST не забывайте писать app.use(express.json()) в начале server.js.Итоги лекции
Что мы теперь умеем:
- ✅ Express: создание веб-сервера и роутов.
- ✅ HTTP: понимание методов GET, POST, статус-кодов 200, 404, 500.
- ✅ JSON: формат обмена данными.
- ✅ Middleware:
express.json()иmorgan. - ✅ SQL + Node.js: безопасные запросы через
mssqlвнутри асинхронных роутов. - ✅ Структура: разделение кода на
routes,db.jsиserver.js. - ✅ REST API: создание интерфейса для взаимодействия программ.
Домашнее задание
Задания для сдачи практической работы №37.
- Реализуйте все 5 пунктов из «Самостоятельных заданий».
- Добавьте роут
GET /stats, который возвращает количество книг, читателей и активных выдач (используйтеCOUNTиGROUP BYв одном запросе). - Настройте
package.jsonтак, чтобы сервер запускался командойnpm start. - Напишите в отчете: чем отличается синхронный код (как в Java) от асинхронного кода в Express (приведите пример одного и того же действия — получения списка).
- Сделайте скриншот окна Thunder Client или Postman с выполненным запросом
POST /readers(код состояния 201).
stmt.executeQuery(), а в Node.js она идет дальше и ждет «коллбэк» или await.Спасибо за работу!
📡
API готово к бою!
Вы создали сервер, который понимает язык интернета. Теперь ваша база «Библиотека» доступна не только через SSMS, но и через HTTP-запросы.