Лаб. работа "Работа с базами данных в Express.js"
Цель работы:
Научиться интегрировать базу данных SQLite с веб-приложением на Express.js для выполнения операций CRUD (создание, чтение, обновление, удаление).
Оборудование и программное обеспечение:
- Компьютер с установленной операционной системой
- Установленный Node.js и npm (Node Package Manager)
- Установленный редактор кода (например, Visual Studio Code)
- Веб-браузер
- Установленный SQLite3
Теоретическая часть:
SQLite — это легковесная реляционная база данных, которая хранится в одном файле на диске. Она идеально подходит для небольших и средних приложений, не требующих масштабируемости, как у больших СУБД (систем управления базами данных).
Практическая часть:
Шаг 1: Установка и настройка
- Создайте новую директорию для вашего проекта и перейдите в нее:
1mkdir my-sqlite-app
2cd my-sqlite-app
- Инициализируйте новый проект npm:
1npm init -y
- Установите необходимые пакеты:
1npm install express sqlite3
Шаг 2: Настройка Express.js
- Создайте файл
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: Проверка работы маршрутов
- Запустите сервер:
1node index.js
Используйте 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: Расширение функциональности базы данных
- Добавьте таблицу
postsдля хранения сообщений пользователей:
1CREATE TABLE posts (id INTEGER PRIMARY KEY, user_id INTEGER, title TEXT, content TEXT, FOREIGN KEY (user_id) REFERENCES users(id));
- Реализуйте маршруты для создания, чтения, обновления и удаления сообщений:
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: Реализация отношений между пользователями и сообщениями
- Реализуйте маршрут для получения всех сообщений конкретного пользователя:
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: Улучшение обработки ошибок и валидации данных
- Добавьте валидацию данных при создании и обновлении пользователей и сообщений. Например, убедитесь, что поля
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});