Skip to main content
Практика завдань

Як NestJS інтегрується з TypeORM?

NestJS + TypeORM

TypeORM є найпопулярнішим ORM для NestJS. Пакет @nestjs/typeorm забезпечує першокласну інтеграцію, з'єднуючи сутності з модульною системою NestJS.


Налаштування

bash
npm install @nestjs/typeorm typeorm pg
typescript
// app.module.ts import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST, port: +process.env.DB_PORT, username: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, autoLoadEntities: true, // автоматична реєстрація всіх сутностей forFeature() synchronize: process.env.NODE_ENV !== 'production', // ⚠️ тільки для розробки! }), ], }) export class AppModule {}

Визначення сутності

typescript
// entities/user.entity.ts import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm'; @Entity('users') export class User { @PrimaryGeneratedColumn() id: number; @Column({ length: 100 }) name: string; @Column({ unique: true }) email: string; @Column({ select: false }) // за замовчуванням виключено з SELECT password: string; @Column({ default: 'user' }) role: string; @Column({ default: true }) isActive: boolean; @OneToMany(() => Post, post => post.user) posts: Post[]; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; }

Шаблон репозиторію

typescript
// users/users.module.ts @Module({ imports: [TypeOrmModule.forFeature([User])], // реєстрація сутності в цьому модулі controllers: [UsersController], providers: [UsersService], }) export class UsersModule {} // users/users.service.ts import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private usersRepository: Repository<User>, ) {} findAll(): Promise<User[]> { return this.usersRepository.find(); } findOne(id: number): Promise<User | null> { return this.usersRepository.findOneBy({ id }); } async create(data: CreateUserDto): Promise<User> { const user = this.usersRepository.create(data); return this.usersRepository.save(user); } async update(id: number, data: UpdateUserDto): Promise<User> { await this.usersRepository.update(id, data); return this.findOne(id); } async remove(id: number): Promise<void> { await this.usersRepository.delete(id); } }

Взаємозв'язки

typescript
// Знайти з взаємозв'язками const users = await this.usersRepository.find({ relations: { posts: true }, }); // Конструктор запитів для складних запитів const users = await this.usersRepository .createQueryBuilder('user') .leftJoinAndSelect('user.posts', 'post') .where('user.isActive = :active', { active: true }) .orderBy('user.createdAt', 'DESC') .take(10) .getMany();

Транзакції

typescript
import { DataSource } from 'typeorm'; @Injectable() export class OrdersService { constructor(private dataSource: DataSource) {} async createOrder(dto: CreateOrderDto) { return this.dataSource.transaction(async manager => { const order = manager.create(Order, dto); await manager.save(order); await manager.decrement(Product, { id: dto.productId }, 'stock', dto.quantity); return order; }); } }

Підсумок

Інтеграція NestJS + TypeORM здійснюється через TypeOrmModule.forRoot() для налаштування з'єднання та TypeOrmModule.forFeature([Entity]) для кожного функціонального модуля. Впроваджуйте Repository<Entity> за допомогою @InjectRepository(), щоб отримати повнофункціональний репозиторій з підтримкою CRUD, конструктора запитів та транзакцій.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань