How does NestJS integrate with TypeORM?
NestJS + TypeORM
TypeORM is the most popular ORM for NestJS. The @nestjs/typeorm package provides first-class integration, connecting entities to NestJS's module system.
Setup
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, // auto-register all forFeature() entities
synchronize: process.env.NODE_ENV !== 'production', // ⚠️ dev only!
}),
],
})
export class AppModule {}Defining an Entity
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 }) // excluded from SELECT by default
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;
}Repository Pattern
typescript
// users/users.module.ts
@Module({
imports: [TypeOrmModule.forFeature([User])], // register entity in this module
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);
}
}Relations
typescript
// Find with relations
const users = await this.usersRepository.find({
relations: { posts: true },
});
// Query builder for complex queries
const users = await this.usersRepository
.createQueryBuilder('user')
.leftJoinAndSelect('user.posts', 'post')
.where('user.isActive = :active', { active: true })
.orderBy('user.createdAt', 'DESC')
.take(10)
.getMany();Transactions
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;
});
}
}Summary
NestJS + TypeORM integration is done via TypeOrmModule.forRoot() for connection setup and TypeOrmModule.forFeature([Entity]) per feature module. Inject Repository<Entity> with @InjectRepository() to get a full-featured repository with CRUD, query builder, and transaction support.
Short Answer
Interview readyPremium
A concise answer to help you respond confidently on this topic during an interview.