Как создать REST API на NestJS: пошаговый гайд

10 минут чтения

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, который можно развернуть и использовать в продакшене!

10 минут чтения

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний