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