Объясните назначение декоратора @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. Он
позволяет легко и эффективно управлять сущностями и взаимодействовать с базой данных, сохраняя при этом чистоту и
читаемость кода.