Как создать REST API на NestJS: пошаговый гайд
NestJS — это мощный фреймворк для создания серверных приложений на Node.js, который использует TypeScript и модульную архитектуру. Он обеспечивает удобные инструменты для работы с REST API, упрощая написание масштабируемых и поддерживаемых приложений.
В этом руководстве мы рассмотрим процесс создания REST API с нуля, начиная с установки и заканчивая реализацией CRUD-операций.
1. Установка NestJS и создание проекта
Для начала необходимо установить NestJS CLI, который поможет быстро создавать и управлять проектами. Установите его глобально с помощью npm:
npm install -g @nestjs/cli
Затем создайте новый проект командой:
nest new my-rest-api
Эта команда создаст структуру проекта, установит все необходимые зависимости и подготовит рабочее окружение.
Перейдите в созданную папку и запустите сервер:
cd my-rest-api
npm run start
Теперь API доступен по адресу http://localhost:3000/
.
2. Создание контроллера
Контроллеры в NestJS обрабатывают HTTP-запросы и управляют логикой маршрутизации. Создадим контроллер с помощью команды:
nest generate controller users
Это создаст файл users.controller.ts
в папке src/users/
со следующей структурой:
import { Controller, Get } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll() {
return 'Возвращаем список пользователей';
}
}
Здесь:
@Controller('users')
указывает, что все маршруты этого контроллера будут начинаться с/users
.@Get()
определяет обработчик GET-запросов на/users
.
Теперь при обращении к http://localhost:3000/users
сервер вернёт строку «Возвращаем список пользователей».
3. Создание сервиса
Сервисы в NestJS отвечают за бизнес-логику приложения. Они позволяют отделить обработку данных от контроллеров. Создадим сервис командой:
nest generate service users
Этот сервис будет управлять данными о пользователях. В файле users.service.ts
определим базовые методы:
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private users = [{ id: 1, name: 'Иван' }, { id: 2, name: 'Мария' }];
findAll() {
return this.users;
}
}
Теперь сервис возвращает список пользователей. Подключим его к контроллеру:
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
findAll() {
return this.usersService.findAll();
}
}
Теперь при обращении к /users
сервер вернёт массив пользователей.
4. Работа с DTO и валидацией
DTO (Data Transfer Object) используются для строгой типизации и валидации данных, передаваемых в API. Создадим DTO для создания пользователя:
export class CreateUserDto {
name: string;
}
Добавим валидацию с использованием class-validator
:
import { IsString } from 'class-validator';
export class CreateUserDto {
@IsString()
name: string;
}
Настроим обработку POST-запросов в контроллере:
import { Body, Controller, Post } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.usersService.create(createUserDto);
}
}
Добавим метод в сервис:
create(user: CreateUserDto) {
const newUser = { id: Date.now(), ...user };
this.users.push(newUser);
return newUser;
}
Теперь можно отправлять POST-запросы с JSON-данными для создания пользователей.
5. Подключение базы данных
NestJS поддерживает работу с различными базами данных. Мы подключим PostgreSQL с помощью TypeORM.
Установите зависимости:
npm install @nestjs/typeorm typeorm pg
Настроим подключение в app.module.ts
:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'user',
password: 'password',
database: 'test_db',
autoLoadEntities: true,
synchronize: true,
}),
],
})
export class AppModule {}
Создадим сущность пользователя:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
}
Теперь NestJS автоматически создаст таблицу в базе данных и будет работать с пользователями через ORM.
6. Структура приложения
После того как мы создали проект, реализовали контроллеры, сервисы и подключили базу данных, структура нашего приложения выглядит следующим образом:
my-rest-api/
├── src/
│ ├── app.module.ts # Главный модуль приложения
│ ├── users/
│ │ ├── users.controller.ts # Контроллер для работы с пользователями
│ │ ├── users.service.ts # Сервис для логики работы с пользователями
│ │ ├── dto/
│ │ │ └── create-user.dto.ts # DTO для создания пользователя
│ │ ├── user.entity.ts # Сущность пользователя для TypeORM
│ └── main.ts # Точка входа в приложение
├── node_modules/ # Зависимости проекта
├── package.json # Конфигурация проекта и зависимости
├── tsconfig.json # Конфигурация TypeScript
└── .gitignore # Файл для исключения из репозитория
Важнейшие компоненты проекта:
- app.module.ts — главный модуль, в котором подключаются другие модули приложения.
- users.controller.ts — контроллер для работы с пользователями.
- users.service.ts — сервис для логики работы с данными пользователей.
- create-user.dto.ts — DTO для валидации данных пользователя при создании.
- user.entity.ts — сущность для TypeORM, которая описывает таблицу пользователей в базе данных.
Это поможет вам лучше понять, как NestJS организует структуру проекта и как легко управлять различными компонентами приложения.
7. Результаты
Мы рассмотрели создание REST API на NestJS, начиная с установки и заканчивая подключением базы данных. Использование NestJS позволяет писать масштабируемые серверные приложения с чистой архитектурой, а интеграция с TypeORM делает работу с данными удобной.
Основные шаги:
- Создали новый проект NestJS.
- Реализовали контроллеры и сервисы.
- Добавили DTO и валидацию данных.
- Подключили PostgreSQL с помощью TypeORM.
Теперь у вас есть готовый REST API, который можно развернуть и использовать в продакшене!
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний