How to use typeorm with MySQL in NestJS

NestJS is Backend framework based on NodeJS and use Typescript for main language.

I will use TypeORM for handle database and use MySQL database. You must makesure in your computer must have MySQL database.

Create project with Nest CLI

nest new my_nest_app

Pick package manager that you want. Pick npm if you want to use npm and then Enter

Open your project with Visual Studio Code

Add Typeorm and mysql with npm in your terminal

npm install --save @nestjs/typeorm typeorm mysql2

Create database in MySQL databases. this example I use “my_nest_app” database

Modify file src/app.module.ts and import TypeormModule

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'mysql',
      database: 'my_nest_app',
      entities: [],
      synchronize: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Run “npm run start:dev” for run nestJS with development mode

npm run start:dev

Next i will create Entities

Create entities directory inside src directory

in this example i use UserEntity for intead of users table in MySQL database

Create users.entity.ts inside src/entities

import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from "typeorm";

@Entity('users')
export class UsersEntity {

    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string

    @Column()
    email: string

    @CreateDateColumn()
    @Column()
    createdAt: Date

    @UpdateDateColumn()
    @Column()
    updatedAt: Date

}

Import Entity to app.module

That will be automaticly create users table in MySQL database

Next I will make CRUD in users table.

create user module,service,controller and repository

nest g mo user
nest g s user
nest g co user

Create user.repository file in src/user/user.repository.ts

import { UsersEntity } from "src/entities/users.entity";
import { EntityRepository, Repository } from "typeorm";

@EntityRepository(UsersEntity)
export class UserRepository extends Repository<UsersEntity>{
    
}

import user.repository.ts in user.module.ts

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { UserRepository } from './user.repository';
import { TypeOrmModule } from '@nestjs/typeorm';

let repositories = TypeOrmModule.forFeature([
  UserRepository
]);

@Module({
  imports: [
    repositories
  ],
  providers: [UserService],
  controllers: [UserController],
  exports: [
    repositories
  ]
})
export class UserModule { }

edit user.service file such as bellow

import { Injectable } from '@nestjs/common';
import { UserRepository } from './user.repository';

@Injectable()
export class UserService {

    constructor(private userRepository: UserRepository) {

    }

    /**
     * list of users
     */
    async listUser() {
        return await this.userRepository.find();
    }

    /**
     * Insert new user
     * @param user 
     * @returns 
     */
    async insert(user: any) {
        return await this.userRepository.insert(user);
    }
}

Create DTO (Data Transfer Object) and install “class-validator”

npm install class-validator

Create user-create.dto.ts

Modify user.controller.ts

Test request create user dan get list user