Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • ownCloud
    • JupyterHub
    • JupyterHub 2
    • VNC
    • Soft
  1. ЭЭБ
  2. ВТиП
  3. Практика
  4. Лаб. работа “Работа с базами данных в Express.js”
  • ЭЭБ
    • ВТиП
      • Теория
        • Введение в веб технологии
        • Протокол HTTP
        • HTML
        • CSS
        • CSS фреймворки
        • JavaScript
        • jQuery
        • JSON
        • Архитектура и технологии создания веб-приложений
        • React
        • Маршрутизация в React
        • Создание серверных приложений с использованием Express.js
        • REST интерфейс и аутентификация Веб-приложений
        • Введение в DevOps и развертывание приложений
      • Практика
        • Лаб. работа “Основы HTML и CSS”
        • Лаб. работа “Основы JavaScript”
        • Лаб. работа “Создание веб-приложений с использованием фреймворка Express.js”
        • Лаб. работа “Работа с базами данных в Express.js”
    • СТ
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Протокол HTTP
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”

Содержание

  • Цель работы:
  • Оборудование и программное обеспечение:
  • Теоретическая часть:
  • Практическая часть:
    • Шаг 1: Установка и настройка
    • Шаг 2: Настройка Express.js
    • Шаг 3: Проверка работы маршрутов
    • Шаг 4: Расширение функциональности базы данных
    • Шаг 5: Реализация отношений между пользователями и сообщениями
    • Шаг 6: Улучшение обработки ошибок и валидации данных
  1. ЭЭБ
  2. ВТиП
  3. Практика
  4. Лаб. работа “Работа с базами данных в Express.js”

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

Веб-технологии и программирование
Практика
Автор

Бизюк Андрей

Дата публикации

18 ноября 2024 г.

Цель работы:

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

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

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

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

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

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

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

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

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

  1. Создайте файл 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: Проверка работы маршрутов

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

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

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

  1. Добавьте таблицу posts для хранения сообщений пользователей:
CREATE TABLE posts (id INTEGER PRIMARY KEY, user_id INTEGER, title TEXT, content TEXT, FOREIGN KEY (user_id) REFERENCES users(id));
  1. Реализуйте маршруты для создания, чтения, обновления и удаления сообщений:
// Создание нового сообщения
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: Реализация отношений между пользователями и сообщениями

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

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

  1. Добавьте валидацию данных при создании и обновлении пользователей и сообщений. Например, убедитесь, что поля 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 });
    });
});
Наверх
Лаб. работа “Создание веб-приложений с использованием фреймворка Express.js”
СТ