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/cliThen, create a new project using the Nest CLI:
1nest new my-nestjs-projectChoose 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/mysql2Here 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 usersCreate 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.jsonStart the Project
Start the project using the following command:
1npm run startBy 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.