Лаб. работа "Работа с базами данных в Express.js"

Цель работы:

Научиться интегрировать базу данных SQLite с веб-приложением на Express.js для выполнения операций CRUD (создание, чтение, обновление, удаление).

Оборудование и программное обеспечение:

  • Компьютер с установленной операционной системой
  • Установленный Node.js и npm (Node Package Manager)
  • Установленный редактор кода (например, Visual Studio Code)
  • Веб-браузер
  • Установленный SQLite3

Теоретическая часть:

SQLite — это легковесная реляционная база данных, которая хранится в одном файле на диске. Она идеально подходит для небольших и средних приложений, не требующих масштабируемости, как у больших СУБД (систем управления базами данных).

Практическая часть:

Шаг 1: Установка и настройка

  1. Создайте новую директорию для вашего проекта и перейдите в нее:
1mkdir my-sqlite-app
2cd my-sqlite-app
  1. Инициализируйте новый проект npm:
1npm init -y
  1. Установите необходимые пакеты:
1npm install express sqlite3

Шаг 2: Настройка Express.js

  1. Создайте файл index.js и добавьте следующий код:
 1const express = require('express');
 2const sqlite3 = require('sqlite3').verbose();
 3const app = express();
 4const port = 3000;
 5
 6// Подключение к базе данных SQLite
 7const db = new sqlite3.Database(':memory:');
 8
 9// Создание таблицы
10db.serialize(() => {
11    db.run('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)');
12});
13
14// Middleware для обработки JSON
15app.use(express.json());
16
17// Маршрут для добавления пользователя
18app.post('/users', (req, res) => {
19    const { name, email } = req.body;
20    db.run('INSERT INTO users (name, email) VALUES (?, ?)', [name, email], function(err) {
21        if (err) {
22            return res.status(500).send(err.message);
23        }
24        res.status(201).send({ id: this.lastID });
25    });
26});
27
28// Маршрут для получения всех пользователей
29app.get('/users', (req, res) => {
30    db.all('SELECT * FROM users', [], (err, rows) => {
31        if (err) {
32            return res.status(500).send(err.message);
33        }
34        res.send(rows);
35    });
36});
37
38// Маршрут для получения пользователя по ID
39app.get('/users/:id', (req, res) => {
40    const { id } = req.params;
41    db.get('SELECT * FROM users WHERE id = ?', [id], (err, row) => {
42        if (err) {
43            return res.status(500).send(err.message);
44        }
45        res.send(row);
46    });
47});
48
49// Маршрут для обновления пользователя
50app.put('/users/:id', (req, res) => {
51    const { id } = req.params;
52    const { name, email } = req.body;
53    db.run('UPDATE users SET name = ?, email = ? WHERE id = ?', [name, email, id], function(err) {
54        if (err) {
55            return res.status(500).send(err.message);
56        }
57        res.send({ changes: this.changes });
58    });
59});
60
61// Маршрут для удаления пользователя
62app.delete('/users/:id', (req, res) => {
63    const { id } = req.params;
64    db.run('DELETE FROM users WHERE id = ?', [id], function(err) {
65        if (err) {
66            return res.status(500).send(err.message);
67        }
68        res.send({ changes: this.changes });
69    });
70});
71
72// Запуск сервера
73app.listen(port, () => {
74    console.log(`Server is running on http://localhost:${port}`);
75});

Шаг 3: Проверка работы маршрутов

  1. Запустите сервер:
1node index.js
  1. Используйте Postman или curl для проверки работы маршрутов.

    • Добавление нового пользователя:
    1curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe", "email":"john@example.com"}' http://localhost:3000/users
    
    • Получение всех пользователей:
    1curl http://localhost:3000/users
    
    • Получение пользователя по ID:
    1curl http://localhost:3000/users/1
    
    • Обновление пользователя:
    1curl -X PUT -H "Content-Type: application/json" -d '{"name":"Jane Doe", "email":"jane@example.com"}' http://localhost:3000/users/1
    
    • Удаление пользователя:
    1curl -X DELETE http://localhost:3000/users/1
    

Шаг 4: Расширение функциональности базы данных

  1. Добавьте таблицу posts для хранения сообщений пользователей:
1CREATE TABLE posts (id INTEGER PRIMARY KEY, user_id INTEGER, title TEXT, content TEXT, FOREIGN KEY (user_id) REFERENCES users(id));
  1. Реализуйте маршруты для создания, чтения, обновления и удаления сообщений:
 1// Создание нового сообщения
 2app.post('/posts', (req, res) => {
 3    const { user_id, title, content } = req.body;
 4    db.run('INSERT INTO posts (user_id, title, content) VALUES (?, ?, ?)', [user_id, title, content], function(err) {
 5        if (err) {
 6            return res.status(500).send(err.message);
 7        }
 8        res.status(201).send({ id: this.lastID });
 9    });
10});
11
12// Получение всех сообщений
13app.get('/posts', (req, res) => {
14    db.all('SELECT * FROM posts', [], (err, rows) => {
15        if (err) {
16            return res.status(500).send(err.message);
17        }
18        res.send(rows);
19    });
20});
21
22// Получение сообщения по ID
23app.get('/posts/:id', (req, res) => {
24    const { id } = req.params;
25    db.get('SELECT * FROM posts WHERE id = ?', [id], (err, row) => {
26        if (err) {
27            return res.status(500).send(err.message);
28        }
29        res.send(row);
30    });
31});
32
33// Обновление сообщения
34app.put('/posts/:id', (req, res) => {
35    const { id } = req.params;
36    const { title, content } = req.body;
37    db.run('UPDATE posts SET title = ?, content = ? WHERE id = ?', [title, content, id], function(err) {
38        if (err) {
39            return res.status(500).send(err.message);
40        }
41        res.send({ changes: this.changes });
42    });
43});
44
45// Удаление сообщения
46app.delete('/posts/:id', (req, res) => {
47    const { id } = req.params;
48    db.run('DELETE FROM posts WHERE id = ?', [id], function(err) {
49        if (err) {
50            return res.status(500).send(err.message);
51        }
52        res.send({ changes: this.changes });
53    });
54});

Шаг 5: Реализация отношений между пользователями и сообщениями

  1. Реализуйте маршрут для получения всех сообщений конкретного пользователя:
1app.get('/users/:id/posts', (req, res) => {
2    const { id } = req.params;
3    db.all('SELECT * FROM posts WHERE user_id = ?', [id], (err, rows) => {
4        if (err) {
5            return res.status(500).send(err.message);
6        }
7        res.send(rows);
8    });
9});

Шаг 6: Улучшение обработки ошибок и валидации данных

  1. Добавьте валидацию данных при создании и обновлении пользователей и сообщений. Например, убедитесь, что поля name и email не пустые при создании пользователя:
 1app.post('/users', (req, res) => {
 2    const { name, email } = req.body;
 3    if (!name || !email) {
 4        return res.status(400).send('Name and email are required');
 5    }
 6    db.run('INSERT INTO users (name, email) VALUES (?, ?)', [name, email], function(err) {
 7        if (err) {
 8            return res.status(500).send(err.message);
 9        }
10        res.status(201).send({ id: this.lastID });
11    });
12});
← Лаб. работа "Создание веб-приложений с …