- Установка на ПК node.js
- Установка на ПК PostgreSQL
- Установка на ПК Postman
- npm install express
- npm install pg
- npm install -D nodemon
- Создаем файл index.js.
- Импортируем express.
const express = require('express');
- Зададим порт (можно из process || статический).
const PORT = process.env.PORT || 8080;
- Из express создадим сам сервер.
const app = express();
- Подключим слушатель на нашем порту.
app.listen(PORT, () => console.log(`Server started on port ${PORT}`));
- В файле package.json пишем скрипт для запуска через node (start).
- В файле package.json пишем скрипт для запуска через nodemon (dev).
- Создать get для проверки работоспособности сервера.
app.get("/", (req, res) => {
res.send(`hello postgres + nodeJS`);
});
- Создаем файл db.js.
- Получаем poll из установленного пакета pg.
const Pool = require('pg').Pool;
- Создаем объект этого класса. С его помощью будем делать запросы к БД.
const pool = new Pool();
- Экспортируем объект класса.
module.exports = pool;
- Первое поле - это пользователь от которого мы будем подключатся к БД (user).
- Второе поле - Пароль, который вы указывали при создании (password).
- Третье поле - Указываем хост. В нашем случае - это локальная машина (host).
- Четвертое поле - указываем порт. По умолчанию при установке он указывается 5432 (port).
- Последнее свойство - это название базы данных(database). (его пока у нас нет, запишем, когда создадим БД).
const pool = new Pool({
user: "postgres",
password: "pass",
host: "localhost",
port: 5432,
database: "database_name",
});
- Открыть powershell и перейти по адресу установленного postgres в папку bin.
- Командой .\psql --version убеждаемся что postgresql установлен.
- Заходим в СУБД (.\psql -U postgres).
- Вводим пароль от пользователя. Команда \l покажет список существующих баз данных.
- Создать новую БД node_postgres_practic (create database node_postgres_practic).
- Подключаемся к Базе Данных (\connect node_postgres_practic). Командой \dt мы можем посмотреть существующие в БД таблицы.
- Переключаем кодировку на 1251
(psql \! chcp 1251)
. - Теперь же мы можем добавить в параметры pool database: "node_postgres_practic".
const pool = new Pool({
user: "postgres",
password: "pass",
host: "localhost",
port: 5432,
database: "node_postgres_practice",
});
- Создать схему с сущностями можно на сайте draw.io.
- Создать две сущности person и post.
- Создать поля сущностей person (id, name, surname).
- Создать поля сущностей post (id, title, content, user_id).
- Указать связь таблиц (один-ко-многим).
- Создать файл database.sql.
- Написать запрос на создание таблицы person.
create TABLE person(
id SERIAL PRIMARY KEY,
name VARCHAR(255),
surname VARCHAR(255)
);
- Написать запрос на создание таблицы post.
create TABLE post(
id SERIAL PRIMARY KEY,
title VARCHAR(255),
content VARCHAR(255),
user_id INTEGER,
FOREIGN KEY (user_id) REFERENCES person (id)
);
- Сделать запрос на создание таблицы person в powershell.
- Сделать запрос на создание таблицы post в powershell.
- Создадим папку controller для работы с запросами.
- Создадим файл user.controller.js.
- Создадим класс внутри которого будем определять методы class UserController.
- Первый метод будет создание пользователя (createUser).
- Вторая функция будет возвращать клиенту всех пользователей (getUsers).
- Третья функция будет возвращать конкретного пользователя по id (getOneUser).
- Четвертая функция будет обновлять данные о пользователе по id (updateUser).
- Пятая функция будет удалять пользователя по id (deleteUser).
- Экспортировать ОБЪЕКТ данного контроллера.
class UserController {
async createUser(req, res){}
async getUsers(req, res){}
async getOneUser(req, res){}
async updateUser(req, res){}
async deleteUser(req, res){}
}
module.exports = new UserController();
- Создадим папку routes для работы с маршрутами, по которым надо будет отправлять запросы.
- Создадим файл user.routes.js.
- Получаем из express роутер.
const Router = require("express");
- Создаем объект этого класса.
const router = new Router();
- Добавим экспорт нашей переменной router.
module.exports = router;
- Импортируем объект controller.
const userControler = require("../controller/user.controller");
- Для каждой из функций определим маршрут по которому она будет отрабатывать. Первая функция - это функция создания пользователя (post запрос).
- Далее у нас будет два get запроса: получить всех пользователей и получить одного пользователя.
- Put запрос для обновления данных.
- И delete запрос для удаления пользователя. Так же тут мы можем через двоеточие указать параметр.
const Router = require("express");
const router = new Router();
const userControler = require("../controller/user.controller");
router.post("/user", userControler.createUser);
router.get("/user", userControler.getUsers);
router.get("/user/:id", userControler.getOneUser);
router.put("/user", userControler.updateUser);
router.delete("/user/:id", userControler.deleteUser);
module.exports = router;
- Переходим в файл index.js.
- Удаляем get запрос, который был для проверки.
- Далее у app воспользуемся функцией use в которую первым параметром передаем url по которому этот роутер будет обрабатывать ("/api"), вторым параметром передаем уже сам роутер.
app.use('/api', userRouter);
- Указываем express что нужно будет распаршивать json строку (app.use(express.json())).
app.use(express.json());
- Начнем с функции createUser.
- С помощью деструктуризацией получим из тела запроса имя и фамилию (req.body).
async createUser(req, res) {
const { name, surname } = req.body;
console.log(name, surname);
res.json(ok);
}
- затем выводим в логи и ответом на клиент вернем просто ok (res.json("ok")).
- Проверить через postman. Отправлять запросы будем на следующий адрес: http://localhost:8080/api/user. Далее переходим к телу запроса (body -> row), и разрешение json, заполняем запрос рандомными именем и фамилией:{"name": "ivan","surname": "ivanov"}.
- В файле user.controller.js импортируем db который мы создавали ранее.
const db = require("../db");
- В функции createUser после получения данных из тела создаем нового пользователя.
- Создаем нового пользователя с помощью db, вызовем функцию query с sql запросом в параметре (INSERT INTO person (name, surname) values ($1, $2) RETURNING *, [1, 2]).
- Ответом на клиент вернем пользователя, а точнее только данные которые находятся в rows[0].
class UserController {
async createUser(req, res) {
const { name, surname } = req.body;
const newPerson = await db.query("INSERT INTO person (name, surname) values ($1, $2) RETURNING *", [name, surname]);
res.json(newPerson[0]);
}
async getUsers(req, res) {}
async getOneUser(req, res) {}
async updateUser(req, res) {}
async deleteUser(req, res) {}
}
- Проверить через postman.
- Создаем новую переменную в которую мы будем помещать пользователей и так же пишем запрос.
- На клиент будем возвращать поле rows.
async getUsers(req, res) {
const users = await db.query(`SELECT * FROM person`)
res.json(users.rows)
}
- Проверить через postman.
- Получаем id из параметров запроса (req.params.id).
- С помощью запроса выделяем пользователя из db.
- И на клиент вернем этого пользователя.
async getOneUser(req, res) {
const id = req.params.id;
const user = await db.query(`SELECT * FROM person WHERE id = $1`, [id]);
res.json(user.rows[0]);
}
- Проверить через postman.
- Получаем из запроса id новое имя name и новую фамилию surname.
- Далее пишем запрос (UPDATE person set name = $1, surname = $2 where id = $3 RETURNING *).
- И возвращаем на клиент результат запроса.
async updateUser(req, res) {
const { id, name, surname } = req.body;
const user = await db.query(
`UPDATE person set name = $1, surname = $2 where id = $3 RETURNING *`,
[name, surname, id]
);
res.json(user.rows[0]);
}
- Проверить через postman.
- Узнаем id пользователя из запроса.
- Создаем запрос на удаление (DELETE FROM person WHERE id = $1).
- Возвращаем результат.
async deleteUser(req, res) {
const id = req.params.id;
const user = await db.query(`DELETE FROM person WHERE id = $1`, [id]);
res.json(user.rows[0]);
}
- Проверить через postman.
- Создаем файл post.controller.js.
- В нем создаем класс PostController.
- Экспортируем новый объект этого класса.
- Создаем две функции для создания и получения createPost и getPostsByUser.
class PostController {
async createPost(req, res){}
async getPostsByUser(req, res){}
}
module.exports = new PostController();
- Импортировать Router из express.
- Cоздать новый объект класса Router.
- Импортировать postController.
- Создать post запрос для создания постов.
- Создать get запрос для получения постов пользователя.
- Экспортировать роутер.
const db = require("../db");
class PostController {
async createPost(req, res) {}
async getPostsByUser(req, res) {}
}
module.exports = new PostController();
- Регистрируем этот роутер в index.js файле.
const postRouter = require("./routes/post.routers");
- Запускаем метод use у app для postRouter.
app.use("/api", postRouter);
- При создании файла из тела функции достаем title и content.
- Делаем запрос на создание поста.
- Возвращаем на клиент созданный пост.
async createPost(req, res) {
const { title, content, userId } = req.body;
console.log(req.body);
const newPost = await db.query(
`INSERT INTO post (title, content, user_id) values ($1, $2, $3) RETURNING *`,
[title, content, userId]
);
res.json(newPost.rows[0]);
}
- Создадим несколько постов с помощью postman.
- Проверить через postman.
- Получаем id клиента из запроса.
- Выбираем все посты с помощью запроса.
- Возвращаем на клиент эти посты.
async getPostsByUser(req, res) {
const id = req.query.id;
const posts = await db.query(`select * from post where user_id = $1`, [id]);
res.json(posts.rows);
}
- Проверить через postman.