Compare commits
2 Commits
0e19118843
...
4bd09cd313
| Author | SHA1 | Date | |
|---|---|---|---|
| 4bd09cd313 | |||
| 76b876ef5d |
24
README.md
24
README.md
@@ -1,5 +1,3 @@
|
|||||||

|
|
||||||
|
|
||||||
# Разрабатываем первое Web API на Node.js
|
# Разрабатываем первое Web API на Node.js
|
||||||
|
|
||||||
Для секции "Веб-разработка: пример Fullstack"
|
Для секции "Веб-разработка: пример Fullstack"
|
||||||
@@ -165,7 +163,7 @@ npm install express
|
|||||||
// Выбираем порт из файла конфигурации .env, либо используем порт 3000 по умолчанию
|
// Выбираем порт из файла конфигурации .env, либо используем порт 3000 по умолчанию
|
||||||
const PORT = process.env.PORT || 3000;
|
const PORT = process.env.PORT || 3000;
|
||||||
|
|
||||||
app.listen(PORT, () => {
|
app.listen(PORT, function() {
|
||||||
console.log(`Сервер запущен и слушает порт ${PORT}`);
|
console.log(`Сервер запущен и слушает порт ${PORT}`);
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
@@ -202,7 +200,7 @@ npm install express
|
|||||||
### **Цель урока**: Создать простейший обработчик GET-запроса и получить ответ от сервера.
|
### **Цель урока**: Создать простейший обработчик GET-запроса и получить ответ от сервера.
|
||||||
|
|
||||||
### **Краткая теория**:
|
### **Краткая теория**:
|
||||||
- **Маршрут (route)** — это правило, которое определяет, как сервер будет реагировать на клиентский запрос к определенному URL (конечной точке) и HTTP-методу (GET, POST и т.д.).
|
- **Маршрут (route)** — это правило, которое определяет, как сервер будет реагировать на клиентский запрос к определенному URL (конечной точке/endpoint) и HTTP-методу (GET, POST и т.д.).
|
||||||
- **Обработчик (handler)** — функция, которая принимает запрос (`req`) и формирует ответ (`res`).
|
- **Обработчик (handler)** — функция, которая принимает запрос (`req`) и формирует ответ (`res`).
|
||||||
|
|
||||||
### **Практические шаги**:
|
### **Практические шаги**:
|
||||||
@@ -210,7 +208,7 @@ npm install express
|
|||||||
2. **Добавьте обработчик для корневого маршрута (`/`) перед строкой `export default app;`**:
|
2. **Добавьте обработчик для корневого маршрута (`/`) перед строкой `export default app;`**:
|
||||||
```javascript
|
```javascript
|
||||||
// Обработчик GET-запроса на корневой URL '/'
|
// Обработчик GET-запроса на корневой URL '/'
|
||||||
app.get('/', (req, res) => {
|
app.get('/', function(req, res) {
|
||||||
// Устанавливаем заголовок ответа
|
// Устанавливаем заголовок ответа
|
||||||
res.setHeader('Content-Type', 'text/plain');
|
res.setHeader('Content-Type', 'text/plain');
|
||||||
// Отправляем текстовый ответ
|
// Отправляем текстовый ответ
|
||||||
@@ -240,7 +238,7 @@ npm install express
|
|||||||
1. **Один параметр**:
|
1. **Один параметр**:
|
||||||
```javascript
|
```javascript
|
||||||
// Когда заходят на /hello/Максим
|
// Когда заходят на /hello/Максим
|
||||||
app.get('/hello/:name', (req, res) => {
|
app.get('/hello/:name', function(req, res) {
|
||||||
const name = req.params.name; // = "Максим"
|
const name = req.params.name; // = "Максим"
|
||||||
res.send(`Привет, ${name}!`);
|
res.send(`Привет, ${name}!`);
|
||||||
});
|
});
|
||||||
@@ -249,7 +247,7 @@ app.get('/hello/:name', (req, res) => {
|
|||||||
2. **Несколько параметров**:
|
2. **Несколько параметров**:
|
||||||
```javascript
|
```javascript
|
||||||
// Когда заходят на /book/сказки/5
|
// Когда заходят на /book/сказки/5
|
||||||
app.get('/book/:genre/:page', (req, res) => {
|
app.get('/book/:genre/:page', function(req, res) {
|
||||||
const genre = req.params.genre; // = "сказки"
|
const genre = req.params.genre; // = "сказки"
|
||||||
const page = req.params.page; // = "5"
|
const page = req.params.page; // = "5"
|
||||||
res.send(`Жанр: ${genre}, Страница: ${page}`);
|
res.send(`Жанр: ${genre}, Страница: ${page}`);
|
||||||
@@ -259,7 +257,7 @@ app.get('/book/:genre/:page', (req, res) => {
|
|||||||
3. **Параметр в середине пути**:
|
3. **Параметр в середине пути**:
|
||||||
```javascript
|
```javascript
|
||||||
// Когда заходят на /category/электроника/product/123
|
// Когда заходят на /category/электроника/product/123
|
||||||
app.get('/category/:categoryName/product/:productId', (req, res) => {
|
app.get('/category/:categoryName/product/:productId', function(req, res) {
|
||||||
const category = req.params.categoryName; // = "электроника"
|
const category = req.params.categoryName; // = "электроника"
|
||||||
const productId = req.params.productId; // = "123"
|
const productId = req.params.productId; // = "123"
|
||||||
res.send(`Категория: ${category}, Товар: ${productId}`);
|
res.send(`Категория: ${category}, Товар: ${productId}`);
|
||||||
@@ -270,7 +268,7 @@ app.get('/category/:categoryName/product/:productId', (req, res) => {
|
|||||||
1. В файле `app.js` добавьте маршрут:
|
1. В файле `app.js` добавьте маршрут:
|
||||||
```javascript
|
```javascript
|
||||||
// Пример запроса: GET http://localhost:3000/double/7
|
// Пример запроса: GET http://localhost:3000/double/7
|
||||||
app.get('/double/:number', (req, res) => {
|
app.get('/double/:number', function(req, res) {
|
||||||
const input = req.params.number; // Получаем параметр из URL
|
const input = req.params.number; // Получаем параметр из URL
|
||||||
|
|
||||||
// Проверяем, является ли параметр числом
|
// Проверяем, является ли параметр числом
|
||||||
@@ -391,7 +389,7 @@ if (b === 0) {
|
|||||||
1. Создайте маршрут `GET /api/user/:id`
|
1. Создайте маршрут `GET /api/user/:id`
|
||||||
2. Если `:id` — число, верните JSON с информацией о пользователе:
|
2. Если `:id` — число, верните JSON с информацией о пользователе:
|
||||||
```javascript
|
```javascript
|
||||||
app.get('/api/user/:id', (req, res) => {
|
app.get('/api/user/:id', function(req, res) {
|
||||||
const id = req.params.id;
|
const id = req.params.id;
|
||||||
|
|
||||||
if (!isNaN(id)) {
|
if (!isNaN(id)) {
|
||||||
@@ -573,15 +571,15 @@ let nextId = 1;
|
|||||||
|
|
||||||
Для POST `/api/notes` получите текст заметки из `req.body.text`, создайте объект заметки с уникальным ID и текущей датой, добавьте его в массив с помощью `push()`, увеличьте `nextId` и верните созданную заметку.
|
Для POST `/api/notes` получите текст заметки из `req.body.text`, создайте объект заметки с уникальным ID и текущей датой, добавьте его в массив с помощью `push()`, увеличьте `nextId` и верните созданную заметку.
|
||||||
|
|
||||||
Для GET `/api/notes/:id` найдите заметку в массиве по ID. Используйте метод `find()`: `const note = notes.find(n => n.id === id);`. Если заметка найдена — верните её, если нет — верните ошибку 404.
|
Для GET `/api/notes/:id` найдите заметку в массиве по ID. Используйте метод `find()`: `const note = notes.find(function(n) { return n.id === id; });`. Если заметка найдена — верните её, если нет — верните ошибку 404.
|
||||||
|
|
||||||
Для DELETE `/api/notes/:id` найдите индекс заметки по ID: `const index = notes.findIndex(n => n.id === id);`, затем удалите её с помощью `splice(index, 1)` и верните подтверждение удаления.
|
Для DELETE `/api/notes/:id` найдите индекс заметки по ID: `const index = notes.findIndex(function(n) { return n.id === id; });`, затем удалите её с помощью `splice(index, 1)` и верните подтверждение удаления.
|
||||||
|
|
||||||
### Важные моменты
|
### Важные моменты
|
||||||
Заметки будут храниться только в памяти сервера и исчезнут при его перезапуске. Для постоянного хранения данных потребуется база данных или файловая система, но это тема для следующих занятий.
|
Заметки будут храниться только в памяти сервера и исчезнут при его перезапуске. Для постоянного хранения данных потребуется база данных или файловая система, но это тема для следующих занятий.
|
||||||
|
|
||||||
### Вопросы для самопроверки
|
### Вопросы для самопроверки
|
||||||
1. Чем отличается `notes[0]` от `notes.find(n => n.id === 1)`?
|
1. Чем отличается `notes[0]` от `notes.find(function(n) { return n.id === 1; })`?
|
||||||
2. Почему лучше использовать отдельный счетчик `nextId`, а не просто длину массива?
|
2. Почему лучше использовать отдельный счетчик `nextId`, а не просто длину массива?
|
||||||
3. Какие HTTP-методы соответствуют операциям CRUD?
|
3. Какие HTTP-методы соответствуют операциям CRUD?
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user