implemented backend
This commit is contained in:
257
backend/src/app.js
Normal file
257
backend/src/app.js
Normal file
@@ -0,0 +1,257 @@
|
||||
import express from 'express';
|
||||
import { json } from 'express';
|
||||
// cors - middleware для разрешения кросс-доменных запросов
|
||||
import cors from 'cors';
|
||||
// Эти модули нужны для работы с путями файлов
|
||||
import { fileURLToPath } from 'url';
|
||||
import { dirname, join } from 'path';
|
||||
|
||||
// Получаем текущий путь к файлу (специально для модулей ES6)
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
// Получаем директорию текущего файла
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
// Создаем экземпляр приложения Express
|
||||
const app = express();
|
||||
|
||||
// Подключаем middleware (промежуточное программное обеспечение)
|
||||
// CORS разрешает запросы с других доменов
|
||||
app.use(cors({
|
||||
origin: 'http://localhost:8080', // разрешаем только с этого домена
|
||||
methods: ['GET', 'POST', 'PUT', 'DELETE'], // разрешаем только эти методы
|
||||
allowedHeaders: ['Content-Type'] // разрешаем только эти заголовки
|
||||
}));
|
||||
// JSON парсер позволяет обрабатывать JSON в теле запросов
|
||||
app.use(json());
|
||||
|
||||
// Создаем массив для хранения заметок в памяти
|
||||
// В реальном приложении здесь была бы база данных
|
||||
let notes = [];
|
||||
|
||||
// Переменная для генерации уникальных ID
|
||||
// Каждая новая заметка получит ID на 1 больше предыдущей
|
||||
let noteIdCounter = 1;
|
||||
|
||||
// ==================== РАЗДЕЛ: РОУТЫ API (маршруты) ====================
|
||||
|
||||
// РОУТ 1: Получение всех заметок (READ)
|
||||
// Метод: GET
|
||||
// Адрес: /notes
|
||||
app.get('/notes', function(request, response) {
|
||||
/*
|
||||
Эта функция обрабатывает запрос на получение всех заметок
|
||||
request - объект запроса (содержит данные от клиента)
|
||||
response - объект ответа (используем для отправки данных клиенту)
|
||||
*/
|
||||
console.log('Получен запрос на получение всех заметок');
|
||||
|
||||
// Отправляем клиенту все заметки в формате JSON
|
||||
// status(200) - код 200 означает "Успешно"
|
||||
response.status(200).json({
|
||||
success: true, // флаг успешного выполнения
|
||||
data: notes, // сами заметки
|
||||
count: notes.length // количество заметок
|
||||
});
|
||||
});
|
||||
|
||||
// РОУТ 2: Получение одной заметки по ID (READ)
|
||||
// Метод: GET
|
||||
// Адрес: /notes/:id
|
||||
// :id - это параметр маршрута (динамическая часть URL)
|
||||
app.get('/notes/:id', function(request, response) {
|
||||
/*
|
||||
Эта функция ищет заметку по ID
|
||||
request.params.id - получаем ID из URL
|
||||
*/
|
||||
console.log('Получен запрос на получение заметки с ID:', request.params.id);
|
||||
|
||||
// Преобразуем ID из строки в число
|
||||
const noteId = parseInt(request.params.id);
|
||||
|
||||
// Ищем заметку в массиве по ID.
|
||||
// В качестве аргумента notes.find() используем
|
||||
// функцию function(note) {}, которая определяет,
|
||||
// совпадает ли id некоторой заметки с id нашей
|
||||
const foundNote = notes.find(function(note) {
|
||||
return note.id === noteId;
|
||||
});
|
||||
|
||||
// Если заметка не найдена
|
||||
if (!foundNote) {
|
||||
console.log('Заметка не найдена');
|
||||
return response.status(404).json({
|
||||
success: false,
|
||||
message: 'Заметка с таким ID не найдена'
|
||||
});
|
||||
}
|
||||
|
||||
// Если заметка найдена - отправляем ее клиенту
|
||||
response.status(200).json({
|
||||
success: true,
|
||||
data: foundNote
|
||||
});
|
||||
});
|
||||
|
||||
// РОУТ 3: Создание новой заметки (CREATE)
|
||||
// Метод: POST
|
||||
// Адрес: /notes
|
||||
app.post('/notes', function(request, response) {
|
||||
/*
|
||||
Эта функция создает новую заметку
|
||||
request.body - содержит данные, отправленные клиентом
|
||||
*/
|
||||
console.log('Получен запрос на создание заметки');
|
||||
|
||||
// Получаем данные из тела запроса
|
||||
const title = request.body.title;
|
||||
const text = request.body.text;
|
||||
const author = request.body.author;
|
||||
|
||||
// Проверяем, все ли обязательные поля заполнены
|
||||
if (!title || !text || !author) {
|
||||
console.log('Ошибка: не все поля заполнены');
|
||||
return response.status(400).json({
|
||||
success: false,
|
||||
message: 'Пожалуйста, заполните все поля: title, text, author'
|
||||
});
|
||||
}
|
||||
|
||||
// Создаем новую заметку
|
||||
const newNote = {
|
||||
id: noteIdCounter, // присваиваем уникальный ID
|
||||
title: title, // заголовок из запроса
|
||||
text: text, // текст заметки из запроса
|
||||
author: author, // автор из запроса
|
||||
createdAt: new Date(), // дата создания (текущее время)
|
||||
updatedAt: new Date() // дата обновления (пока равна дате создания)
|
||||
};
|
||||
|
||||
// Добавляем заметку в массив
|
||||
notes.push(newNote);
|
||||
// Увеличиваем счетчик ID для следующей заметки
|
||||
noteIdCounter++;
|
||||
|
||||
console.log('Создана новая заметка с ID:', newNote.id);
|
||||
|
||||
// Отправляем ответ с созданной заметкой
|
||||
// status(201) - код 201 означает "Создано"
|
||||
response.status(201).json({
|
||||
success: true,
|
||||
message: 'Заметка успешно создана',
|
||||
data: newNote
|
||||
});
|
||||
});
|
||||
|
||||
// РОУТ 4: Обновление существующей заметки (UPDATE)
|
||||
// Метод: PUT
|
||||
// Адрес: /notes/:id
|
||||
app.put('/notes/:id', function(request, response) {
|
||||
/*
|
||||
Эта функция обновляет существующую заметку
|
||||
request.params.id - ID заметки для обновления
|
||||
request.body - новые данные для заметки
|
||||
*/
|
||||
console.log('Получен запрос на обновление заметки с ID:', request.params.id);
|
||||
|
||||
const noteId = parseInt(request.params.id);
|
||||
|
||||
// Ищем индекс заметки в массиве
|
||||
const noteIndex = notes.findIndex(function(note) {
|
||||
return note.id === noteId;
|
||||
});
|
||||
|
||||
// Если заметка не найдена
|
||||
if (noteIndex === -1) {
|
||||
console.log('Заметка для обновления не найдена');
|
||||
return response.status(404).json({
|
||||
success: false,
|
||||
message: 'Заметка с таким ID не найдена'
|
||||
});
|
||||
}
|
||||
|
||||
// Получаем данные из запроса
|
||||
// Если какое-то поле не передано, используем старое значение
|
||||
const updatedTitle = request.body.title || notes[noteIndex].title;
|
||||
const updatedText = request.body.text || notes[noteIndex].text;
|
||||
const updatedAuthor = request.body.author || notes[noteIndex].author;
|
||||
|
||||
// Обновляем заметку
|
||||
notes[noteIndex] = {
|
||||
...notes[noteIndex], // копируем все старые поля
|
||||
title: updatedTitle, // обновляем заголовок
|
||||
text: updatedText, // обновляем текст
|
||||
author: updatedAuthor, // обновляем автора
|
||||
updatedAt: new Date() // обновляем дату изменения
|
||||
};
|
||||
|
||||
console.log('Заметка с ID', noteId, 'обновлена');
|
||||
|
||||
// Отправляем обновленную заметку
|
||||
response.status(200).json({
|
||||
success: true,
|
||||
message: 'Заметка успешно обновлена',
|
||||
data: notes[noteIndex]
|
||||
});
|
||||
});
|
||||
|
||||
// РОУТ 5: Удаление заметки (DELETE)
|
||||
// Метод: DELETE
|
||||
// Адрес: /notes/:id
|
||||
app.delete('/notes/:id', function(request, response) {
|
||||
/*
|
||||
Эта функция удаляет заметку по ID
|
||||
*/
|
||||
console.log('Получен запрос на удаление заметки с ID:', request.params.id);
|
||||
|
||||
const noteId = parseInt(request.params.id);
|
||||
|
||||
// Ищем индекс заметки в массиве
|
||||
const noteIndex = notes.findIndex(function(note) {
|
||||
return note.id === noteId;
|
||||
});
|
||||
|
||||
// Если заметка не найдена
|
||||
if (noteIndex === -1) {
|
||||
console.log('Заметка для удаления не найдена');
|
||||
return response.status(404).json({
|
||||
success: false,
|
||||
message: 'Заметка с таким ID не найдена'
|
||||
});
|
||||
}
|
||||
|
||||
// Удаляем заметку из массива
|
||||
// splice(index, 1) удаляет 1 элемент начиная с позиции index
|
||||
const deletedNote = notes.splice(noteIndex, 1)[0];
|
||||
|
||||
console.log('Заметка с ID', noteId, 'удалена');
|
||||
|
||||
// Отправляем подтверждение удаления
|
||||
response.status(200).json({
|
||||
success: true,
|
||||
message: 'Заметка успешно удалена',
|
||||
data: deletedNote
|
||||
});
|
||||
});
|
||||
|
||||
// РОУТ 6: Корневой маршрут (для проверки работы сервера)
|
||||
// Метод: GET
|
||||
// Адрес: /
|
||||
app.get('/', function(request, response) {
|
||||
/*
|
||||
Простой маршрут для проверки, что сервер работает
|
||||
*/
|
||||
response.json({
|
||||
message: 'Добро пожаловать в API для заметок!',
|
||||
endpoints: {
|
||||
getAllNotes: 'GET /notes',
|
||||
getOneNote: 'GET /notes/:id',
|
||||
createNote: 'POST /notes',
|
||||
updateNote: 'PUT /notes/:id',
|
||||
deleteNote: 'DELETE /notes/:id'
|
||||
},
|
||||
instructions: 'Используйте Postman или curl для тестирования API'
|
||||
});
|
||||
});
|
||||
|
||||
// Экспортируем приложение для использования в server.js
|
||||
export default app;
|
||||
20
backend/src/server.js
Normal file
20
backend/src/server.js
Normal file
@@ -0,0 +1,20 @@
|
||||
// Импортируем настроенное приложение Express из app.js
|
||||
import app from './app.js';
|
||||
|
||||
// Определяем порт для сервера
|
||||
// process.env.PORT - берет порт из переменных окружения (если есть)
|
||||
// || 3000 - если переменной нет, используем порт 3000
|
||||
const PORT = process.env.PORT || 3000;
|
||||
|
||||
// Запускаем сервер на указанном порту
|
||||
app.listen(PORT, function() {
|
||||
// Эта функция выполнится при успешном запуске сервера
|
||||
console.log(`Backend server running on port ${PORT}`);
|
||||
console.log(`Вы можете открыть в браузере: http://localhost:${PORT}`);
|
||||
console.log('Для тестирования API используйте:');
|
||||
console.log('1. GET http://localhost:3000/notes - получить все заметки');
|
||||
console.log('2. GET http://localhost:3000/notes/1 - получить заметку с ID=1');
|
||||
console.log('3. POST http://localhost:3000/notes - создать новую заметку');
|
||||
console.log('4. PUT http://localhost:3000/notes/1 - обновить заметку с ID=1');
|
||||
console.log('5. DELETE http://localhost:3000/notes/1 - удалить заметку с ID=1');
|
||||
});
|
||||
Reference in New Issue
Block a user