Поиск по сайту
Ctrl + K
Вопросы по Nest.js

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

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

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

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

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

  • Инъекция зависимостей: Декоратор позволяет использовать Dependency Injection в вашем сервисе, делая код более модульным и тестируемым.
  • Интерфейсы репозиториев: Он предоставляет мощные интерфейсы для выполнения операций с базой данных без необходимости писать сложные SQL-запросы.
  • Упрощение кода: Использование репозиториев упрощает реализацию бизнес-логики, поскольку большинство операций можно выполнять простыми методами.
  • Пример использования @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);
        }
    }
    

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

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

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