最近在学习nestjs相关的知识,在实现的过程中遇到了一些问题,此系列用于记录解决问题的过程,希望可以帮助到有同样困惑的朋友们。由于作者也是刚接触框架,所以暂时不会涉及到原理方面的内容,主要以实现功能为主。
作为此系列的第一篇文章,将实现对于mysql数据库用户表的新增和查询功能。除了nestjs框架,我们会使用到typeorm,这是一个ORM(Object-relation mapping)框架,简单来讲,就是通过实例对象的方法,来操作数据库。
以下是涉及到的几个主要npm库的版本:
- @nestjs/common 10.0.0
- @nestjs/core 10.0.0
- @nestjs/typeorm 10.0.2
- typeorm 0.3.20
- mysql2 3.11.0
一、创建项目
使用nestjs官方提供的脚手架创建项目。
# 全局安装@nestjs/cli库
npm i -g @nestjs/cli
# 创建项目
nest new <project-name>
# 或者创建ts项目
nest new <project-name> --strict
# 进入项目目录
cd <project-name>
# 启动项目
npm run start:dev
注意:nestjs默认的端口号是3000,端口被占用的话,可以在main.ts文件中修改端口号。
二、配置数据库
首先需要创建一个项目的数据库,创建用户表,
-- 创建数据库plant_guide
-- 创建用户表
CREATE TABLE IF NOT EXISTS `plant_user`
(
`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT "用户id",
`name` VARCHAR(50) NOT NULL COMMENT "用户名称",
`is_active` BOOLEAN NOT NULL DEFAULT true COMMENT "用户状态"
);
-- 插入用户数据
INSERT INTO plant_user(name) VALUES("欧阳锋");
INSERT INTO plant_user(name) VALUES("杨过");
INSERT INTO plant_user(name) VALUES("小龙女");
INSERT INTO plant_user(name) VALUES("一休");
接着,项目中配置数据库的信息,
// app.module.ts
import { Module, NestModule } 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: '********', // 自己配置的数据访问密码
database: 'plant_guide',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true, // 在生产环境不要用true
autoLoadEntities: true
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {}
三、实现用户表的CRUD
在src文件夹下创建user文件夹,用来编写用户功能的接口内容。
src
│
└─user
│ user-http.module.ts
│ user.controller.ts
│ user.entity.ts
│ user.module.ts
│ user.service.ts
│
├─dto
│ create-user.dto.ts
│
└─interfaces
user.interface.ts
3.1 Entity
创建用户实例,字段和表字段一一对应。
// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity('plant_user') // 注意此处要和数据库表的名字保持一致,否则typeorm会创建新的表
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column({ default: true })
isActive: boolean;
}
3.2 Controller
创建Controller层,用于处理请求,响应内容。
// user.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
@Controller('user')
export class UserController {
constructor(private userService: UserService) {}
@Get()
async findAll() {
return await this.userService.findAll();
}
@Post()
async create(@Body() user: CreateUserDto) {
return await this.userService.create(user);
}
}
3.3 Service
创建Service层,主要用于处理业务逻辑。
// user.service.ts
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { User } from './user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>
){}
async findAll(): Promise<User[]> {
return await this.userRepository.find();
}
async create(dto: CreateUserDto) {
const { name } = dto;
const user = await this.userRepository.findOneBy({
name: name
})
if (user) {
return {
code: 200,
msg: '已添加'
}
} else {
await this.userRepository
.createQueryBuilder()
.insert()
.values([
{name: name}
])
.execute()
return {
code: 200,
msg: '添加成功'
}
}
}
}
3.4 Dto
// create-user.dto.ts
export class CreateUserDto {
name: string;
}
3.5 Module
// user.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
@Module({
imports: [TypeOrmModule.forFeature([User])],
exports: [TypeOrmModule]
})
export class UserModule {}
// user-http.module.ts
import { Module } from '@nestjs/common';
import { UserModule } from './user.module'
import { UserService } from './user.service';
import { UserController } from './user.controller';
@Module({
imports: [UserModule],
providers: [UserService],
controllers: [UserController]
})
export class UserHttpModule {}
四、导入服务
// app.module.ts
// ...
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserHttpModule } from './service/user/user-http.module';
@Module({
imports: [
TypeOrmModule.forRoot({
//...
}),
UserHttpModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {}
以上就实现了对于用户表的新增和查询功能,修改和删除的功能同理。