Building a Robust Backend with NestJS and TypeORM
Prerequisites
Before diving into the tutorial, ensure you have:
- Node.js v12 LTS or Node >v14 installed on your computer
- Basic working knowledge of NestJS and JavaScript
Setting up NestJS
To get started, install NestJS using the CLI:
npm install -g @nestjs/cli
nest new my-nestjs-app
This command scaffolds a basic NestJS application.
Configuring TypeORM
Install TypeORM and the SQLite driver:
npm install typeorm sqlite3
In the src/app.module.ts
file, import the TypeORM module and configure it to use SQLite:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Post } from './post.entity';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'qlite',
database: '../db',
entities: [Post],
synchronize: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Creating Database Entities
Create a post.entity.ts
file to define the Post entity:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
}
Using the TypeORM QueryBuilder
The TypeORM QueryBuilder provides a powerful way to perform complex database operations. Here’s an example of how to use it to retrieve all posts:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Post } from './post.entity';
@Injectable()
export class PostService {
constructor(
@InjectRepository(Post)
private readonly postRepository: Repository<Post>,
) {}
async getAllPosts(): Promise<Post[]> {
return this.postRepository
.createQueryBuilder('post')
.select(['post.id', 'post.title'])
.getMany();
}
}
Performing JOIN Operations
TypeORM provides several ways to perform JOIN operations. Here’s an example of how to use the QueryBuilder to perform a LEFT JOIN:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Post } from './post.entity';
import { Comment } from './comment.entity';
@Injectable()
export class PostService {
constructor(
@InjectRepository(Post)
private readonly postRepository: Repository<Post>,
) {}
async getPostComments(): Promise<Post[]> {
return this.postRepository
.createQueryBuilder('post')
.leftJoinAndSelect('post.comments', 'comment')
.select(['post.id', 'post.title', 'comment.text'])
.getMany();
}
}