Як і інші фреймворки Node.js, Nest.js пропонує широкий спектр інструментів для розробки надійних та масштабованих серверних рішень. Важливим аспектом є розуміння ефективної реалізації операцій створення, читання, оновлення та видалення (CRUD), які є основою розробки API.
Давайте розглянемо, як можна розробити CRUD REST API у Nest.js, використовуючи TypeORM та базу даних PostgreSQL.
Початок роботи з Nest.js
Для початку, встановіть інструмент командного рядка Nest.js:
npm i -g @nestjs/cli
Далі, створіть новий проєкт за допомогою команди:
nest new crud-app
Інструмент CLI запропонує вам обрати менеджер пакетів; виберіть той, що вам більше підходить. Ми будемо використовувати npm, стандартний менеджер пакетів Node.
CLI згенерує базовий проєкт Nest.js зі всіма необхідними файлами конфігурації та початковими залежностями для запуску програми.
Нарешті, перейдіть до директорії проєкту та запустіть сервер розробки:
cd crud-app
npm run start
Ви можете ознайомитися з кодом цього проєкту у GitHub репозиторії.
Створення бази даних PostgreSQL
У цьому керівництві використовується хмарний екземпляр PostgreSQL, проте ви також можете налаштувати локальну базу даних PostgreSQL. Ви можете встановити PostgreSQL на Windows, macOS або Linux.
Для налаштування хмарного екземпляра PostgreSQL:


Налаштування з’єднання з базою даних
У кореневій директорії вашого проєкту створіть файл .env та вставте URL-адресу з’єднання з базою даних наступним чином:
DATABASE_URL="<your connection url here>"
Тепер встановіть наступні пакети:
npm install pg typeorm @nestjs/typeorm @nestjs/config
Далі, згенеруйте модуль бази даних за допомогою інструмента CLI:
nest g module database
Відкрийте файл database/database.module.ts та додайте наступний код конфігурації бази даних:
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from '../users/models/user.entity';@Module({
imports: [
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],useFactory: async (configService: ConfigService) => ({
type: 'postgres',
url: configService.get('DATABASE_URL'),
entities: [User],
synchronize: true
}),
}),
],
})export class DatabaseModule {}
Цей модуль бази даних керує підключенням, налаштовуючи модуль TypeORM з необхідними параметрами, зокрема URL-адресою бази даних.
Крім того, він визначає сутність користувача як частину конфігурації, яка задає структуру та властивості даних, що зберігаються у відповідній таблиці бази даних PostgreSQL.
На цьому етапі ваш код може видати помилку, оскільки ви ще не створили сутність користувачів. Ви зробите це у наступних кроках.
Оновлення файлу app.module.ts
Нарешті, оновіть головний модуль програми, щоб включити конфігурацію модуля бази даних:
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DatabaseModule } from './database/database.module';@Module({
imports: [
ConfigModule.forRoot({
envFilePath: '.env',
}),
DatabaseModule,
],controllers: [AppController],
providers: [AppService],
})export class AppModule {}
Визначення модуля Users
Модуль користувачів виступає централізованим компонентом, відповідальним за інкапсуляцію та управління логікою, необхідною для реалізації функціональності CRUD API.
Виконайте наступну команду терміналу, щоб створити модуль користувачів API:
nest g module users
Інструмент CLI автоматично оновлює файл app.module.ts, відображаючи внесені зміни, окрім створення модуля користувача. Це забезпечує належну інтеграцію новоствореного модуля користувачів у конфігурацію модуля програми.
Створення сутності користувача
TypeORM – це бібліотека об’єктно-реляційного відображення (ORM), яка спрощує взаємодію з базою даних у програмах на TypeScript, відображаючи об’єкти JavaScript у таблицях бази даних.
Створюючи сутність користувача за допомогою TypeORM, ви визначаєте структуру та властивості даних користувача у базі даних PostgreSQL.
У каталозі users створіть новий файл models/user.entity.ts та додайте наступний код:
import { Entity, PrimaryGeneratedColumn, Column, } from "typeorm";@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;@Column()
name: string;@Column()
email: string;
}
Сутність користувача визначає структуру даних користувача, що зберігаються у базі даних. В даному випадку, це ідентифікатор як первинний ключ, а також стовпці імені та електронної пошти.
Створення служби CRUD API
Тепер створіть службу API, яка буде керувати логікою операцій CRUD, виконавши команду нижче:
nest g service users
Відкрийте файл user-auth.service.ts та додайте наступний код:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import {User} from './models/user.entity';@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
) {}async findAll(): Promise<User[]> {
return this.userRepository.find();
}async findOne(id: number): Promise<User> {
return this.userRepository.findOne({ where: { id } });
}async create(user: Partial<User>): Promise<User> {
const newuser = this.userRepository.create(user);
return this.userRepository.save(newuser);
}async update(id: number, user: Partial<User>): Promise<User> {
await this.userRepository.update(id, user);
return this.userRepository.findOne({ where: { id } });
}async delete(id: number): Promise<void> {
await this.userRepository.delete(id);
}
}
Клас UsersService визначає різні методи API, призначені для обробки операцій CRUD. Ці методи включають отримання всіх користувачів, пошук конкретного користувача за ідентифікатором, створення нового користувача, оновлення існуючого та видалення даних користувача з бази даних.
Визначення контролера для API
Створіть контролер, який буде керувати кінцевими точками API для операцій, пов’язаних з користувачем:
nest g controller users
Далі додайте наведений нижче код до файлу users.controller.ts:
import { Controller, Get, Post, Body, Put, Param, Delete, NotFoundException, HttpCode } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './models/user.entity';@Controller('api/users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}@Get()
async findAll(): Promise<User[]> {
return this.usersService.findAll();
}@Post()
@HttpCode(201)
async create(@Body() user: User): Promise<User> {
const createdUser = await this.usersService.create(user);
return createdUser;
}@Put(':id')
async update (@Param('id') id: number, @Body() user: User): Promise<any> {
await this.usersService.update(id, user);
return { message: 'User updated successfully' };
}@Delete(':id')
async delete(@Param('id') id: number): Promise<any> {
const user = await this.usersService.findOne(id);if (!user) {
throw new NotFoundException('User does not exist!');
}await this.usersService.delete(id);
return { message: 'User deleted successfully' };
}
}
Контролер обробляє кінцеві точки API для операцій з користувачами. Він обробляє запити GET для отримання всіх користувачів, POST для створення нових, PUT для оновлення та DELETE для видалення.
Використовуючи UsersService та взаємодіючи з сутністю User, контролер надає повний API для управління операціями з даними, пов’язаними з користувачами, що зберігаються у базі даних.
Оновлення файлу users.module.ts
Нарешті, оновіть файл users.module.ts, як показано нижче, щоб переконатися, що включено сутність користувача та модуль TypeORM, який встановлює з’єднання з базою даних:
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './models/user.entity';@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UsersController],
providers: [UsersService]
})export class UsersModule {}
Нарешті, запустіть сервер розробки, щоб перевірити операції CRUD за допомогою Postman:
npm run start
Сервер запуститься на порту 3000, і ви можете відправляти API запити до http://localhost:3000/api/users.
Розробка серверних програм за допомогою Nest.js
Незалежно від того, чи ви розробляєте простий REST API або складну веб-програму, Nest.js пропонує повний набір можливостей для створення надійних та ефективних серверних систем.
Nest.js надає більш структурований підхід до розробки проєкту, ніж Express.js. Це гарантує, що ви можете впевнено створювати, масштабувати та підтримувати складні програми завдяки організованій та модульній архітектурі.