Вопросы по Nest.js

Объясните назначение декоратора @InjectRepository() в NestJS.

Что такое @InjectRepository()?

В NestJS, декоратор @InjectRepository() используется для внедрения репозитория (repository), который управляет взаимодействием с определенной сущностью в базе данных. Этот декоратор является частью библиотек TypeORM или MikroORM, и он упрощает доступ к базовым операциям CRUD (Create, Read, Update, Delete).

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

Почему использовать @InjectRepository()?

  1. Инъекция зависимостей: Декоратор позволяет использовать Dependency Injection в вашем сервисе, делая код более модульным и тестируемым.
  2. Интерфейсы репозиториев: Он предоставляет мощные интерфейсы для выполнения операций с базой данных без необходимости писать сложные SQL-запросы.
  3. Упрощение кода: Использование репозиториев упрощает реализацию бизнес-логики, поскольку большинство операций можно выполнять простыми методами.

Пример использования @InjectRepository()

Давайте рассмотрим пример, как использовать @InjectRepository() в вашем сервисе. Предположим, у нас есть сущность User.

// user.entity.ts
import {Entity, Column, PrimaryGeneratedColumn} from 'typeorm';

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    email: string;
}

Теперь, мы создадим UserService, где мы будем использовать декоратор @InjectRepository().

// user.service.ts
import {Injectable} from '@nestjs/common';
import {InjectRepository} from '@nestjs/typeorm';
import {Repository} from 'typeorm';
import {User} from './user.entity';

@Injectable()
export class UserService {
    constructor(
        @InjectRepository(User)
        private readonly userRepository: Repository<User>,
    ) {
    }

    async createUser(name: string, email: string): Promise<User> {
        const user = this.userRepository.create({name, email});
        return this.userRepository.save(user);
    }

    async findAll(): Promise<User[]> {
        return this.userRepository.find();
    }

    async findOne(id: number): Promise<User> {
        return this.userRepository.findOneBy({id});
    }

    async updateUser(id: number, updateData: Partial<User>): Promise<User> {
        await this.userRepository.update(id, updateData);
        return this.findOne(id);
    }

    async deleteUser(id: number): Promise<void> {
        await this.userRepository.delete(id);
    }
}

Объяснение кода

  1. Импортирование декоратора и Repository: Мы импортируем InjectRepository и Repository из @nestjs/typeorm и typeorm.
  2. Создание класса сервиса: В классе UserService мы объявляем конструктор, который принимает репозиторий User.
  3. CRUD операции:
    • createUser: Создает нового пользователя и сохраняет его в базе данных.
    • findAll: Возвращает всех пользователей.
    • findOne: Находит пользователя по его идентификатору.
    • updateUser: Обновляет информацию о пользователе.
    • deleteUser: Удаляет пользователя по его идентификатору.

Заключение

Использование декоратора @InjectRepository() является отличным способом инкапсулировать доступ к данным в NestJS. Он позволяет легко и эффективно управлять сущностями и взаимодействовать с базой данных, сохраняя при этом чистоту и читаемость кода.