Лаб. работа “Работа с базами данных в Express.js”
Веб-технологии и программирование
Практика
Цель работы:
Научиться интегрировать базу данных SQLite с веб-приложением на Express.js для выполнения операций CRUD (создание, чтение, обновление, удаление).
Оборудование и программное обеспечение:
- Компьютер с установленной операционной системой
- Установленный Node.js и npm (Node Package Manager)
- Установленный редактор кода (например, Visual Studio Code)
- Веб-браузер
- Установленный SQLite3
Теоретическая часть:
SQLite — это легковесная реляционная база данных, которая хранится в одном файле на диске. Она идеально подходит для небольших и средних приложений, не требующих масштабируемости, как у больших СУБД (систем управления базами данных).
Практическая часть:
Шаг 1: Установка и настройка
- Создайте новую директорию для вашего проекта и перейдите в нее:
- Инициализируйте новый проект npm:
- Установите необходимые пакеты:
Шаг 2: Настройка Express.js
- Создайте файл
index.js
и добавьте следующий код:
const express = require('express');
const sqlite3 = require('sqlite3').verbose();
const app = express();
const port = 3000;
// Подключение к базе данных SQLite
const db = new sqlite3.Database(':memory:');
// Создание таблицы
db.serialize(() => {
db.run('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)');
});
// Middleware для обработки JSON
app.use(express.json());
// Маршрут для добавления пользователя
app.post('/users', (req, res) => {
const { name, email } = req.body;
db.run('INSERT INTO users (name, email) VALUES (?, ?)', [name, email], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.status(201).send({ id: this.lastID });
});
});
// Маршрут для получения всех пользователей
app.get('/users', (req, res) => {
db.all('SELECT * FROM users', [], (err, rows) => {
if (err) {
return res.status(500).send(err.message);
}
res.send(rows);
});
});
// Маршрут для получения пользователя по ID
app.get('/users/:id', (req, res) => {
const { id } = req.params;
db.get('SELECT * FROM users WHERE id = ?', [id], (err, row) => {
if (err) {
return res.status(500).send(err.message);
}
res.send(row);
});
});
// Маршрут для обновления пользователя
app.put('/users/:id', (req, res) => {
const { id } = req.params;
const { name, email } = req.body;
db.run('UPDATE users SET name = ?, email = ? WHERE id = ?', [name, email, id], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.send({ changes: this.changes });
});
});
// Маршрут для удаления пользователя
app.delete('/users/:id', (req, res) => {
const { id } = req.params;
db.run('DELETE FROM users WHERE id = ?', [id], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.send({ changes: this.changes });
});
});
// Запуск сервера
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
Шаг 3: Проверка работы маршрутов
- Запустите сервер:
Используйте Postman или curl для проверки работы маршрутов.
- Добавление нового пользователя:
curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe", "email":"john@example.com"}' http://localhost:3000/users
- Получение всех пользователей:
- Получение пользователя по ID:
- Обновление пользователя:
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Jane Doe", "email":"jane@example.com"}' http://localhost:3000/users/1
- Удаление пользователя:
Шаг 4: Расширение функциональности базы данных
- Добавьте таблицу
posts
для хранения сообщений пользователей:
CREATE TABLE posts (id INTEGER PRIMARY KEY, user_id INTEGER, title TEXT, content TEXT, FOREIGN KEY (user_id) REFERENCES users(id));
- Реализуйте маршруты для создания, чтения, обновления и удаления сообщений:
// Создание нового сообщения
app.post('/posts', (req, res) => {
const { user_id, title, content } = req.body;
db.run('INSERT INTO posts (user_id, title, content) VALUES (?, ?, ?)', [user_id, title, content], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.status(201).send({ id: this.lastID });
});
});
// Получение всех сообщений
app.get('/posts', (req, res) => {
db.all('SELECT * FROM posts', [], (err, rows) => {
if (err) {
return res.status(500).send(err.message);
}
res.send(rows);
});
});
// Получение сообщения по ID
app.get('/posts/:id', (req, res) => {
const { id } = req.params;
db.get('SELECT * FROM posts WHERE id = ?', [id], (err, row) => {
if (err) {
return res.status(500).send(err.message);
}
res.send(row);
});
});
// Обновление сообщения
app.put('/posts/:id', (req, res) => {
const { id } = req.params;
const { title, content } = req.body;
db.run('UPDATE posts SET title = ?, content = ? WHERE id = ?', [title, content, id], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.send({ changes: this.changes });
});
});
// Удаление сообщения
app.delete('/posts/:id', (req, res) => {
const { id } = req.params;
db.run('DELETE FROM posts WHERE id = ?', [id], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.send({ changes: this.changes });
});
});
Шаг 5: Реализация отношений между пользователями и сообщениями
- Реализуйте маршрут для получения всех сообщений конкретного пользователя:
Шаг 6: Улучшение обработки ошибок и валидации данных
- Добавьте валидацию данных при создании и обновлении пользователей и сообщений. Например, убедитесь, что поля
name
иemail
не пустые при создании пользователя:
app.post('/users', (req, res) => {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).send('Name and email are required');
}
db.run('INSERT INTO users (name, email) VALUES (?, ?)', [name, email], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.status(201).send({ id: this.lastID });
});
});