Поиск по сайту:

Как создать CRUD API с использованием Node, PostgresSQL и Express


Начните управлять своими данными с помощью этого самого простого из приложений REST и узнайте о разработке современных веб-приложений, пока вы занимаетесь этим.

API CRUD управляет данными посредством четырех основных операций с базой данных: создание, чтение, обновление и удаление. Вы можете создать простой CRUD API, используя только Express и базу данных PostgreSQL.

Начните с создания сервера Express, к которому вы подключите PostgreSQL. Затем создайте функции CRUD и подключите их к конечным точкам API. Как только вы это сделаете, вы сможете подключить Node к PostgreSQL и выполнять запросы к базе данных по каждому маршруту.

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

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

  • Установите Node на свой компьютер.
  • Установите сервер PostgreSQL на свой компьютер.
  • Иметь базовые знания Express.js.

Создать экспресс-сервер

Чтобы создать сервер Express, начните с создания нового каталога и входа в него:

mkdir notes
cd notes

Затем инициализируйте npm:

npm init -y

Эта команда создаст файл package.json в папке заметок. Наконец, установите Express.

npm install express

Создайте новый файл с именем index.js и добавьте следующий код.

const express = require("express");
const app = express();
 
app.use(express.urlencoded({
  extended: true
}));
 
app.use(express.json())
app.listen(3000, () => console.log("Listening on port 3000"));

Это создаст новый сервер, прослушивающий порт 3000.

Создайте базу данных PostgreSQL

Выполните следующую команду в командной строке psql, чтобы создать базу данных PostgreSQL с именем Noteb.

postgres=# CREATE DATABASE notedb;

Запустите эту команду, чтобы просмотреть все базы данных Postgres и убедиться, что вы создали базу данных отмеченную:

postgres=# \l

Подключиться к базе данных

Прежде всего, подключите приложение Node к серверу PostgreSQL. Вы можете использовать модуль node-Postgres.

Запустите следующее, чтобы установить его через npm:

npm install pg

Рекомендуется подключаться к базе данных в отдельном файле.

Создайте новый файл с именем db.js и добавьте следующее.

const { Client } = require("pg");
const { user, host, database, password, port } = require("./dbConfig");
 
const client = new Client({
  user,
  host,
  database,
  password,
  port,
});
 
client.connect();
module.exports = client;

Здесь вы экспортируете строку подключения, которую будете использовать для связи с базой данных. Обратите внимание, что вы читаете настройки подключения к базе данных из файла конфигурации dbConfig.js. Поэтому создайте dbConfig.js и добавьте в него следующие данные.

module.exports = {
  user: "{dbUser}",
  host: "{dbHost}",
  database: "notedb",
  password: "{dbPassword}",
  port: 5432,
};

Не забудьте заменить данные базы данных своими локальными значениями.

Создайте таблицу PostgreSQL

В командной строке psql создайте таблицу с именем Notes. Для начала подключитесь к базе данных Noteb с помощью команды \c.

postgres=# \c notedb

Затем создайте таблицу в подключенной базе данных с помощью команды CREATE TABLE.

notedb=# CREATE TABLE notes (
  ID SERIAL PRIMARY KEY,
  note VARCHAR(255)
);

Эта таблица довольно проста. У него есть только идентификатор, который представляет собой автоматически сгенерированный первичный ключ, и текстовое поле с названием note.

Создать заметку

Вместо выполнения CRUD-операций в маршрутах создайте функции, которые будут взаимодействовать с базой данных, в отдельном файле.

Создайте вспомогательный файл с именем helper.js и импортируйте объект подключения из db.js.

const client = require("./db");

Используйте следующий код для создания функции createNote().

const createNote = (req, res) => {
  try {
    const { note } = req.body;
 
    if (!note) {
      throw Error("Send note in request body");
    }
 
    client.query(
      "INSERT INTO notes (note) VALUES ($1)",
      [note],
      (err, data) => {
        res.status(201).json({
          error: null,
          message: "Created new note",
        });
      }
    );
  } catch (error) {
    res.status(500).json({
      error: error.message,
      message: "Failed to create new note",
    });
  }
};

Эта функция сначала проверяет, содержит ли тело запроса примечание. Если примечание отсутствует, выдается ошибка.

Чтобы создать заметку, функция использует предложение INSERT. Он возвращает объект JSON, содержащий нулевое сообщение об ошибке и сообщение об успехе в случае успеха.

Получить все заметки

Чтобы получить все примечания из таблицы, используйте предложение SELECT *.

const getNotes = (req, res) => {
  try {
    client.query("SELECT * FROM notes", (err, data) => {
      if (err) throw err;
 
      res.status(200).json({
        err: null,
        notes: data.rows,
      });
    });
  } catch (error) {
    res.status(500).json({
      err: error.message,
      notes: null,
    });
  }
};

getNotes() отправляет массив заметок в объект ответа, если запрос успешен.

Получить заметку по идентификатору

API также будет иметь конечную точку, которая возвращает заметку по идентификатору. В helper.js добавьте функцию getNoteById().

const getNoteById = (req, res) => {
  try {
    const { id } = req.params;
    client.query("SELECT * FROM notes WHERE id=$1", [id], (err, data) => {
      if (err) throw err;
      res.status(200).json({
        err: null,
        note: data.rows[0],
      });
    });
  } catch (error) {
    res.status(500).json({
      err: err.message,
      note: null,
    });
  }
};

Эта функция вернет объект JSON, содержащий примечание и объект ошибки.

Обновить заметку по идентификатору

Чтобы обновить заметку, вам нужна заметка и идентификатор этой заметки. Вы получите примечание из тела запроса и идентификатор из URL-адреса.

Функция updateNoteById() использует предложение UPDATE для обновления существующей заметки новой заметкой.

const updateNoteById = (req, res) => {
  try {
    const { id } = req.params;
    const { note } = req.body;
    client.query(
      "UPDATE notes SET note = $1 WHERE id = $2",
      [note, id],
      (err, data) => {
        if (err) throw err;
 
        res.status(201).json({
          err: null,
          message: "Updated note",
        });
      }
    );
  } catch (error) {
    res.status(500).json({
      err: error.message,
      message: "Failed to update note",
    });
  }
};

Эта функция возвращает сообщение об успехе, если таблица обновлена, и сообщение об ошибке, если это не так.

Удалить заметку по идентификатору

Чтобы удалить заметку по идентификатору из таблицы, используйте следующий код.

const deleteNote = (req, res) => {
  try {
    const { id } = req.params;
    client.query("DELETE FROM notes WHERE id=$1", [id], (err, data) => {
      if (err) throw err;
 
      res.status(200).json({
        error: null,
        message: "Note deleted",
      });
    });
  } catch (error) {
    res.status(500).json({
      error: error.message,
      message: "Failed to delete note",
    });
  }
};

Теперь, когда вы создали все функции CRUD, экспортируйте их.

В helper.js добавьте следующее.

module.exports = { createNote, getNotes, getNoteById, updateNoteById, deleteNote };

Вы импортируете их в index.js при создании конечных точек API.

Создание API-маршрутов

Последний шаг — создать конечные точки API в index.js для каждой операции CRUD.

Начните с импорта файла helper.js.

const db = require("./helper")

Затем создайте каждую конечную точку.

app.get("/notes", db.getNotes);
app.get("/note/:id", db.getNoteById);
app.put("/note/:id", db.updateNoteById);
app.post("/note", db.createNote);
app.delete("/note/:id", db.deleteNote);

REST API для обновления вашей базы данных

Закончив, вы можете проверить работу вашего API, используя клиент REST, например Postman, или написав модульные тесты. Вы должны быть в состоянии гарантировать, что все пять конечных точек работают так, как вы ожидаете.

Вы также можете проверять и управлять данными, добавленными в базу данных, с помощью инструмента pgAdmin. Это приложение с графическим интерфейсом, которое упрощает администрирование базы данных и взаимодействие с серверами PostgreSQL.

Статьи по данной тематике: