Как подключить экспресс -приложение к Postgres, используя Scilezize

Как подключить экспресс -приложение к Postgres, используя Scilezize

22 июня 2025 г.

Введение

PostgreSQL (сокращен как Postgres) является одной из наиболее часто используемых баз данных в программных приложениях для создания. Postgres-это система управления базами данных с открытым исходным кодом (RDBMS). Одним из преимуществ использования Postgres является его поддержка как реляционных, так и нереляционных (NOSQL) запросов.

Одним из способов подключения базы данных к веб -приложению является использование ORM (Object Relational Mapper). ORM действует как уровень связи между вашим приложением и базой данных. Цель этого учебника - объяснить, как вы можете использовать Postgres в своем Express Application с помощью ORM Sedize.

ORM -продолжение описывается как:

Современный TypeScript и Node.js Orm для Oracle, Postgres, MySQL, MariaDB, SQLite и SQL Server и многое другое. -Продолжение документации

Вы создадите простой API управления задачами. API сможет создавать, перечислять, обновлять статус завершения и удалять задачи.

This tutorial is the first in an upcoming series of tutorials focused on using relational databases in Express using Sequelize. In the upcoming tutorials, you’ll explore database seeding, migrations, and associations in Sequelize.

Предварительные условия

Чтобы приступить к этому уроку, вам понадобится следующее:

  • Текстовый редактор (например, VS Code)
  • Клиент API для тестирования конечных точек (например, почтальон)
  • Node.js установлен на вашем компьютере
  • Основное знание экспресса
  • Экземпляр Postgres, работающих локально или удаленно

Настройка проекта

Мы начнем с настройки соответствующих файлов и каталогов для создания приложения Express и установки необходимых пакетов. Используемые команды применимы только к терминалу Linux.

  1. Создайте каталог проектов:

        mkdir tasks-manager-api
    
  2. Перейдите к каталогу проекта:

        cd tasks-manager-api
    
  3. Инициализируйте пакет NPM, выполнив следующую команду для созданияpackage.jsonФайл с настройками по умолчанию:

        npm init -y
    
  4. Установить экспресс и другие основные зависимости:

       npm install express express-async-errors dotenv && npm install nodemon --save-dev
    
  5. Установите драйвер Postgres для node.js:

       npm install pg
    
  6. Установить продолжение:

       npm install sequelize
    
  7. В корневом каталоге создайтеmodelsиutils Папки:

    mkdir models utils
    
  8. В корневом каталоге создайте.envФайл, который будет содержать номер порта сервера и URL -адрес базы данных любого экземпляра Postgres:

    PORT=5000
    DATABASE_URL=postgres://<user>:<password>@<host>:<port>/<database>
    
  9. В корневом каталоге создайтеindex.jsФайл, который является точкой записи приложения:

       touch index.js
    
  10. Настройка команды для запуска локального сервера разработки, редактируяscriptsобъект вpackage.json:

    {
        //…
        "scripts": {
            "test": "echo \"Error: no test specified\" && exit 1",
            "dev": "nodemon index.js",
            "start": "node index.js"
        },
        //…
    }
    

Структура папки проекта должна выглядеть так:

Настройка продолжения

Создайте два файла вutilsкаталог:config.jsиdb.js.

Загрузка переменных среды

Вconfig.jsфайл, загрузите переменные среды из.envФайл с использованиемdotenvупаковка. Затем экспортироватьPORTиDATABASE_URLпеременные, чтобы их можно было получить в других частях приложения.

Аconfig.jsФайл должен иметь следующее содержимое:

require('dotenv').config()

const PORT = process.env.PORT || 3000
const DATABASE_URL = process.env.DATABASE_URL

module.exports = {
    PORT,
    DATABASE_URL
}

Создание экземпляра Scentize

Вdb.jsФайл, создайте экземпляр продолжения. Вы можете создать экземпляр продолжения, передавая URI подключения базы данных (сохраненный вDATABASE_URL) к продолжению конструктора. Затем вы создаете функциюconnectToDB,это проверит соединение с базой данных, вызываяauthenticateфункция Наконец, вы экспортируетеconnectToDBфункция и экземпляр продолжения.

Аutils/db.jsФайл должен иметь следующее содержимое:

const Sequelize = require("sequelize");
const { DATABASE_URL } = require("./config");

const sequelize = new Sequelize(DATABASE_URL)

const connectToDB = async () => {
    try {
        await sequelize.authenticate()
        console.log("Database connection established successfully.")
    } catch (error) {
        console.log("Unable to connect to the database:", error)
        return process.exit(1)
    }
    return null
}

module.exports = {
    connectToDB,
    sequelize
}

Определение модели задачи

Модель продолжения - это представление таблицы в базе данных. Вы можете определитьTaskмодели, расширяя продолжениеModelкласс и вызовModel.init(attributes, options)функция

Вmodelsкаталог, создайтеtask.jsФайл со следующим содержанием:

const {Model, DataTypes} = require("sequelize")
const {sequelize} = require("../utils/db")

class Task extends Model {}

Task.init({
    id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    title: {
        type: DataTypes.STRING,
        allowNull: false
    },
    completed: {
        type: DataTypes.BOOLEAN,
        defaultValue: false
    }
}, {
    sequelize,
    modelName: "Task",
    timestamps: true,
    underscored: true,
    defaultScope: {
        attributes: {
            exclude: ["createdAt", "updatedAt"]
        }
    }
})

Task.sync()

module.exports = Task

Аattributesпараметр определяет структуруTaskТаблица в базе данных. АTaskМодель имеет три атрибута:

  • id: Целочисленное поле, которое представляет собой автоматический усиливающий первичный ключ, используемый для уникальной идентификации каждой записи.
  • title: Поле строки, которое представляет имя задачи.
  • completed:completedПоле имеет логическое значение, которое указывает, была ли задача выполнена.

АoptionsПараметр конфигурирует, как продолжение обрабатывает модель. АTaskМодель имеет следующие параметры:

  • sequelize: Спокойный экземпляр, созданный ранее вutils/db.jsПолем
  • modelName: Имя таблицы, созданного в базе данных.
  • timestamps: Когда установленоtrue, добавляетcreatedAtиupdatedAtПоля автоматически к модели.
  • underscored: Когда установленоtrue, преобразует поля корпуса верблюда в корпус змеи в базе данных.
  • defaultScope: Исключает определенные атрибуты по умолчанию при запросе.

АTask.sync()Функция синхронизирует модель с базой данных, создавая таблицу, если таблица не существует. Тем не менее, вы должны отметить, что синхронизация должна выполняться с использованием миграций.

Создание сервера Express

Наконец, вы собираете все это вместе, создав Express Server. Вindex.jsФайл, вы настраиваете необходимое промежуточное программное обеспечение, определяете маршруты конечной точки API и запускаете сервер Express.

АstartФункция отвечает за инициализацию сервера Express. АstartФункция сначала проверяет соединение с базой данных, вызываяconnectToDB()функция Если подключение успешно, оно запускает Express Server, который прослушивает указанный порт.

Аindex.jsФайл имеет следующее содержимое:

require("express-async-errors");
const express = require("express");
const app = express();
const { PORT } = require("./utils/config");
const { connectToDB } = require("./utils/db");
const Task = require("./models/task");

// middlewares
app.use(express.json());

// routes
app.get("/api/tasks", async (req, res) => {
  const tasks = await Task.findAll();
  res.json({
    message: "List of tasks",
    tasks: tasks,
  });
});

app.post("/api/tasks", async (req, res) => {
  const { title } = req.body;
  const task = await Task.create({ title });
  res.status(201).json({
    message: "Task created successfully",
    task,
  });
});

app.patch("/api/tasks/:id/toggle-completed", async (req, res) => {
  const { id } = req.params;
  const task = await Task.findByPk(id);
  if (!task) {
    return res.status(404).json({ message: "Task not found" });
  }
  task.completed = !task.completed;
  await task.save();
  res.json({
    message: task.completed
      ? "Task marked as completed"
      : "Task marked as not completed",
    task,
  });
});

app.delete("/api/tasks/:id", async (req, res) => {
  const { id } = req.params;
  const task = await Task.findByPk(id);
  if (!task) {
    return res.status(404).json({ message: "Task not found" });
  }
  await task.destroy();
  res.json({
    message: "Task deleted successfully",
  });
});

const start = async () => {
  try {
    await connectToDB();
    app.listen(PORT, console.log(`Server is running on port ${PORT}`));
  } catch (error) {
    console.error(error);
    process.exit(1);
  }
};

start();

Тестирование конечной точки API

Теперь вы можете приступить к проверке конечных точек API:

  1. Создайте новую задачу -POST /api/tasks:

Post Request

  1. Перечислите все задачи -GET /api/tasks:

Get Request

  1. Статус завершения переключения -PATCH /api/tasks/:id/toggle-completed:

Patch Request

  1. Удалить задачу -DELETE /api/task:

Delete Request

Заключение

Теперь вы знаете, как подключить экспресс -приложение к базе данных Postgres, используя Secutize. Вы создали простой API диспетчера задач, и в процессе вы настроили продолжение, подключенные к экземпляру Postgres, определилиTaskмодель и создал конечные точки API.

В настоящее время логика контроллера написана вindex.jsФайл для простоты. В предстоящих учебных пособиях мы рефактируем эту кодовую базу в более масштабируемую структуру, используя контроллеры, маршрутизаторы и миграции продолжения.

Для дальнейшего чтения вам следует пройти черезПродолжение документацииЧтобы узнать больше о модельных запросах, проверке, ассоциациях и многом другом.

Вы можете найти полный исходный код для этого учебника наGitHubПолем

Ресурсы

  • Продолжение документации (V6)
  • Что такое postgresql? - AWS
  • Использование реляционных баз данных с Scentize - Fullstackopen
  • Express.js документация


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE