КАТАЛОГ ТОВАРОВ: ПЕРВЫЙ НАСТОЯЩИЙ СЕРВЕР

1. ЧТО НУЖНО
Node.js LTS (22.13 или новее): https://nodejs.org/en/download
PostgreSQL и pgAdmin: https://www.postgresql.org/download/
Редактор VS Code: https://code.visualstudio.com/
Сохраните пароль пользователя postgres, который задаёте при установке PostgreSQL.
Этот проект запускается локально. Для первого запуска нужен интернет, чтобы установить пакеты.

2. СОЗДАЙТЕ БАЗУ
Откройте pgAdmin. Подключитесь к своему локальному серверу PostgreSQL.
Правой кнопкой по Databases → Create → Database. Имя: backend_course. Save.
Выберите backend_course → Tools → Query Tool.
Откройте в Query Tool файл schema.sql из проекта. Нажмите Execute (F5).
Проверьте: SELECT * FROM products ORDER BY id;
Должны появиться Тетрадь и Ручка. schema.sql не удаляет таблицы или существующие записи.

3. НАСТРОЙТЕ ПРОЕКТ
Распакуйте ZIP. В VS Code: Файл → Открыть папку → backend-course.
Откройте Терминал → Создать терминал.
Убедитесь, что терминал открыт в папке, где лежит package.json.
Проверьте:
node -v
npm -v
Затем:
npm install
Сделайте копию .env.example с именем .env (точка в начале обязательна).
В .env замените YOUR_PASSWORD на свой пароль postgres.
Если логин не postgres, замените и имя пользователя. Если порт другой — замените 5432.
Символы @, #, /, : и пробелы в пароле должны быть URL-кодированы (например, @ → %40).
Не отправляйте .env в чат, не кладите его в public и не публикуйте в Git.
Файл .env — конфигурация, не JavaScript.

4. ЗАПУСТИТЕ
В терминале:
npm start
Оставьте терминал открытым. Откройте http://localhost:3000 в браузере.
Не открывайте index.html двойным щелчком: страницу должен отдать Express.
Добавьте товар. Обновите страницу. Товар останется в списке.
В pgAdmin выполните SELECT * FROM products ORDER BY id; и найдите новую строку.
Остановка сервера: Ctrl+C. После изменения app.js остановите и запустите заново.

5. КАК ЧИТАТЬ ФАЙЛЫ
public/index.html — форма, кнопки, список.
public/style.css — внешний вид.
public/script.js — DOM, обработчик формы, fetch.
app.js — маршруты Express, проверки входных данных, SQL.
schema.sql — структура таблицы и стартовые записи.
.env — строка подключения к PostgreSQL.
package.json — зависимости и команда npm start.
Код сервера не вставляется в HTML. SQL выполняет PostgreSQL. Браузер обращается к Express.

6. ПРОСЛЕДИТЕ ПУТЬ ДАННЫХ
Нажатие «Добавить» → submit → preventDefault → чтение input → fetch POST /products.
Express разбирает JSON → проверяет name и price → pool.query с $1 и $2.
PostgreSQL сохраняет строку → RETURNING возвращает её → Express отправляет 201.
script.js читает response.json() → запрашивает обновлённый список → меняет DOM.
Откройте F12 → Network: смотрите метод, статус и ответ запросов /products.
Вкладка Console браузера и терминал сервера — разные места.

7. ПРОВЕРЬТЕ МАРШРУТЫ
GET /products — весь список.
GET /products/1 — один товар. /products/99999 — 404.
POST /products — создать; JSON: {"name":"Альбом","price":300}; успех 201.
PATCH /products/1 — изменить цену; JSON: {"price":125}; успех 200.
DELETE /products/1 — удалить; успех 200. Повторное удаление — 404.
PATCH можно попробовать из Console на открытой странице:
fetch('/products/1', {method:'PATCH', headers:{'Content-Type':'application/json'}, body:JSON.stringify({price:125})}).then(r=>r.json()).then(console.log);
После этого нажмите «Обновить список».

8. ЧТО СДЕЛАТЬ САМОСТОЯТЕЛЬНО
Добавьте кнопку изменения цены в списке; маршрут PATCH уже готов.
Сделайте фильтр по максимальной цене через GET /products?maxPrice=...
Проверьте ввод на сервере. Значение SQL передавайте через $1, а не склеиванием строк.
Добавьте поле quantity с проверкой и покажите его на странице.
Объясните, что произойдёт при отсутствии await у pool.query.

9. ЕСЛИ НЕ ЗАПУСТИЛОСЬ
node не найден — установите Node.js и перезапустите терминал.
ENOENT package.json — терминал открыт не в той папке.
Cannot find module express — выполните npm install в папке проекта.
.env not found — создайте .env из .env.example, проверьте отображение скрытых файлов.
ECONNREFUSED — проверьте, запущен ли PostgreSQL и верен ли порт.
password authentication failed — проверьте логин и пароль в DATABASE_URL.
database does not exist — создайте backend_course в pgAdmin.
relation products does not exist — выполните schema.sql именно в backend_course.
Порт 3000 занят — остановите второй сервер или укажите PORT=3001 в .env, затем откройте localhost:3001.
Ошибка 500 — посмотрите сообщение в терминале сервера; клиенту скрыты внутренние сведения.

10. ГРАНИЦЫ УЧЕБНОГО ПРИМЕРА
Сервер слушает только этот компьютер (127.0.0.1). Здесь нет аккаунтов и прав доступа.
Это учебная база на ноутбуке, она не связана с аккаунтами тренажёра.
Не используйте этот пример как готовый публичный интернет-магазин.
Документация: https://expressjs.com/en/starter/hello-world.html
Параметры SQL: https://node-postgres.com/features/queries
