Як NestJS інтегрується з TypeORM?
NestJS + TypeORM
TypeORM є найпопулярнішим ORM для NestJS. Пакет @nestjs/typeorm забезпечує першокласну інтеграцію, з'єднуючи сутності з модульною системою NestJS.
Налаштування
bash
npm install @nestjs/typeorm typeorm pgtypescript
// 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.