How to Set Up a NestJS + MySQL + TypeScript Project
- 590Words
- 3Minutes
- 05 Jul, 2024
This article provides a detailed guide on how to set up a NestJS + MySQL + TypeScript project from scratch to help you quickly get started and build your own project.
Project Initialization
First, we need to globally install the Nest CLI:
1npm install -g @nestjs/cli
Then, create a new project using the Nest CLI:
1nest new my-nestjs-project
Choose npm or yarn as your package manager and follow the prompts to complete the project initialization.
Install Necessary Dependencies
Next, enter the project directory and install the necessary dependencies:
1cd my-nestjs-project2npm install --save @nestjs/typeorm typeorm mysql23npm install --save-dev @types/mysql2
Here we install the @nestjs/typeorm
, typeorm
, and mysql2
packages along with their type definitions.
Create Modules, Controllers, and Services
Next, generate a user module using the Nest CLI:
1nest generate module users2nest generate controller users3nest generate service users
Create a User entity and add the following content in src/users/user.entity.ts
:
1import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";2
3@Entity()4export class User {5 @PrimaryGeneratedColumn()6 id: number;7
8 @Column()9 name: string;10
11 @Column()12 email: string;13}
Import the User entity in src/users/users.module.ts
:
1import { Module } from "@nestjs/common";2import { TypeOrmModule } from "@nestjs/typeorm";3import { UsersService } from "./users.service";4import { UsersController } from "./users.controller";5import { User } from "./user.entity";6
7@Module({8 imports: [TypeOrmModule.forFeature([User])],9 providers: [UsersService],10 controllers: [UsersController],11})12export class UsersModule {}
Implement CRUD Operations
Implement CRUD operations in src/users/users.service.ts
:
1import { Injectable } from "@nestjs/common";2import { InjectRepository } from "@nestjs/typeorm";3import { Repository } from "typeorm";4import { User } from "./user.entity";5
6@Injectable()7export class UsersService {8 constructor(9 @InjectRepository(User)10 private usersRepository: Repository<User>,11 ) {}12
13 findAll(): Promise<User[]> {14 return this.usersRepository.find();15 }16
17 findOne(id: number): Promise<User> {18 return this.usersRepository.findOneBy({ id });19 }20
21 create(user: User): Promise<User> {22 return this.usersRepository.save(user);23 }24
25 async update(id: number, user: User): Promise<void> {26 await this.usersRepository.update(id, user);27 }28
29 async remove(id: number): Promise<void> {30 await this.usersRepository.delete(id);31 }32}
Define routes in src/users/users.controller.ts
:
1import {2 Controller,3 Get,4 Post,5 Body,6 Param,7 Delete,8 Put,9} from "@nestjs/common";10import { UsersService } from "./users.service";11import { User } from "./user.entity";12
13@Controller("users")14export class UsersController {15 constructor(private readonly usersService: UsersService) {}16
17 @Get()18 findAll(): Promise<User[]> {19 return this.usersService.findAll();20 }21
22 @Get(":id")23 findOne(@Param("id") id: number): Promise<User> {24 return this.usersService.findOne(id);25 }26
27 @Post()28 create(@Body() user: User): Promise<User> {29 return this.usersService.create(user);30 }31
32 @Put(":id")33 update(@Param("id") id: number, @Body() user: User): Promise<void> {34 return this.usersService.update(id, user);35 }36
37 @Delete(":id")38 remove(@Param("id") id: number): Promise<void> {39 return this.usersService.remove(id);40 }41}
Then, configure the TypeORM module in src/app.module.ts
:
1import { Module } from "@nestjs/common";2import { TypeOrmModule } from "@nestjs/typeorm";3import { AppController } from "./app.controller";4import { AppService } from "./app.service";5import { UsersModule } from "./users/users.module";6import { User } from "./users/user.entity";7
8@Module({9 imports: [10 TypeOrmModule.forRoot({11 type: "mysql",12 host: "localhost",13 port: 3306,14 username: "root",15 password: "password",16 database: "test",17 entities: [User],18 synchronize: true,19 }),20 UsersModule,21 ],22 controllers: [AppController],23 providers: [AppService],24})25export class AppModule {}
Note: It is recommended to set synchronize
to false in a production environment to avoid data loss risks.
Project Directory Structure
The project directory structure should look like this:
1my-nestjs-project2├── src3│ ├── app.controller.ts4│ ├── app.module.ts5│ ├── app.service.ts6│ ├── main.ts7│ └── users8│ ├── user.entity.ts9│ ├── users.controller.ts10│ ├── users.module.ts11│ └── users.service.ts12├── test13├── .gitignore14├── nest-cli.json15├── ormconfig.json16├── package.json17├── README.md18├── tsconfig.build.json19└── tsconfig.json
Start the Project
Start the project using the following command:
1npm run start
By default, the NestJS project will run at http://localhost:3000
. You can test the API endpoints by visiting this address and using Postman or other tools.
Conclusion
This article provides a detailed guide on how to set up a NestJS + MySQL + TypeScript project from scratch, including project initialization, installing dependencies, configuring TypeORM, creating modules, and implementing CRUD operations.