diff --git a/README.md b/README.md index 48d0dc1..cdd243c 100644 --- a/README.md +++ b/README.md @@ -477,3 +477,103 @@ res.status(400).json({ ### **Примеры кодов ошибок**: - `"INVALID_NUMBERS"` — когда параметры не числа - `"DIVISION_BY_ZERO"` — когда делим на ноль + +--- + +![](img2.jpg) + +# 👷 **Дополнительные задания (повышенная сложность!)** + +## 📝 Задание 1: Использование POST и DELETE методов для редактирования текста в объявлении сайта + +### Цель задания +Научиться использовать методы POST и DELETE для изменения данных на сервере, понять разницу между методами, которые только читают данные (GET) и теми, которые их изменяют. + +### Теория: HTTP-методы и состояние сервера +HTTP-методы определяют тип операции, которую мы хотим выполнить. GET используется для получения данных без изменений, POST — для создания или отправки новых данных, DELETE — для удаления данных. + +В этом задании вы будете использовать переменную на сервере для хранения состояния приложения между запросами. Это означает, что все пользователи, которые обращаются к серверу, будут видеть одно и то же объявление. + +### Практическая задача +Создайте API для управления объявлением на сайте с тремя методами: + +1. **Просмотр объявления** — GET `/api/ad` + Возвращает текущее объявление или сообщение о его отсутствии. + +2. **Установка объявления** — POST `/api/ad` + Устанавливает новое объявление, отправленное в теле запроса. + +3. **Очистка объявления** — DELETE `/api/ad` + Полностью удаляет текущее объявление. + +### Как реализовать + +Начните с создания переменной для хранения объявления в начале файла `app.js`, после импортов. Например: `let currentAd = null;` + +Для GET-метода проверьте, есть ли значение в переменной `currentAd`. Если объявление существует — верните его, если нет — сообщите, что объявление не установлено. + +Для POST-метода потребуется middleware `express.json()` для чтения JSON из тела запроса. Добавьте строку `app.use(express.json())` в `app.js` после создания экземпляра приложения. В обработчике POST получите текст объявления из `req.body.text` и сохраните его в переменную `currentAd`. + +DELETE-метод должен просто устанавливать `currentAd = null` и возвращать подтверждение удаления. + +### Важные вопросы для обсуждения +- Почему для изменения данных лучше использовать POST, а не GET? +- Как данные сохраняются между запросами разных пользователей? +- Что произойдет с объявлением при перезапуске сервера? + +Для тестирования этих методов вам понадобится специальный инструмент вроде cURL или Postman, так как браузер по умолчанию отправляет только GET-запросы. + +--- + +## 📒 Задание 2: "Ящик заметок" с использованием массива + +### Цель задания +Научиться работать с массивами в JavaScript и реализовать базовые CRUD-операции (Create, Read, Update, Delete). + +### Теория: Массивы в JavaScript +Массив — это упорядоченный список элементов. Создать массив можно так: `let notes = []` (пустой массив) или `let notes = ["Первая заметка", "Вторая"]` (массив с данными). + +Основные операции с массивами: +- Добавление элемента: `notes.push("Новая заметка")` +- Получение элемента: `notes[0]` (первый элемент, индексы начинаются с 0) +- Удаление элемента: `notes.splice(индекс, 1)` +- Длина массива: `notes.length` + +### Теория: CRUD-операции +CRUD — это основа большинства веб-приложений: +- **Create** (Создать) — добавление новой заметки (POST) +- **Read** (Чтение) — получение списка или одной заметки (GET) +- **Update** (Обновление) — изменение существующей заметки (PUT/PATCH) +- **Delete** (Удаление) — удаление заметки (DELETE) + +### Практическая задача +Создайте полноценное API для управления заметками с четырьмя операциями: + +1. **Получить все заметки** — GET `/api/notes` +2. **Добавить заметку** — POST `/api/notes` +3. **Получить одну заметку** — GET `/api/notes/:id` +4. **Удалить заметку** — DELETE `/api/notes/:id` + +### Как реализовать + +Создайте массив для хранения заметок и счетчик для ID: +```javascript +let notes = []; +let nextId = 1; +``` + +Для GET `/api/notes` просто верните весь массив `notes` в формате JSON. + +Для POST `/api/notes` получите текст заметки из `req.body.text`, создайте объект заметки с уникальным ID и текущей датой, добавьте его в массив с помощью `push()`, увеличьте `nextId` и верните созданную заметку. + +Для GET `/api/notes/:id` найдите заметку в массиве по ID. Используйте метод `find()`: `const note = notes.find(n => n.id === id);`. Если заметка найдена — верните её, если нет — верните ошибку 404. + +Для DELETE `/api/notes/:id` найдите индекс заметки по ID: `const index = notes.findIndex(n => n.id === id);`, затем удалите её с помощью `splice(index, 1)` и верните подтверждение удаления. + +### Важные моменты +Заметки будут храниться только в памяти сервера и исчезнут при его перезапуске. Для постоянного хранения данных потребуется база данных или файловая система, но это тема для следующих занятий. + +### Вопросы для самопроверки +1. Чем отличается `notes[0]` от `notes.find(n => n.id === 1)`? +2. Почему лучше использовать отдельный счетчик `nextId`, а не просто длину массива? +3. Какие HTTP-методы соответствуют операциям CRUD? diff --git a/img2.jpg b/img2.jpg new file mode 100644 index 0000000..ec9969a Binary files /dev/null and b/img2.jpg differ