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();
  }
}

Leave a Reply