我正在参与掘金创作者训练营第6期,点击了解活动详情
前言
Nestjs入门,使用nest-cli创建项目并新建接口 - 掘金 (juejin.cn)
从上一篇文章中,已经搭建了nest-admin的项目基础,也添加了users
模块的增删改查接口。
我们需要对接数据库,新建users
表,并修改users.service.ts
的代码进行数据库的交互,还需要使用swagger ui
生成api
文章
首先需要安装数据库
安装MySQL
并使用TypeORM
连接
使用Docker
下载MySQL
镜像及创建MySQL
容器
2022年了,再去一步步安装MySQL
的话,我自问没信心一次性安装顺利,还是使用docker
一步到位吧
首先安装docker
,这里不详细描述了,建议到官网下载,还可以下载docker desktop
管理本地镜像和容器
安装docker
之后,打开终端输入
docker -v
Docker version 20.10.17, build 100c701
可以看到docker
安装成功,接着就可以安装MySQL
镜像了
安装镜像之前,我们打开dockerHub
,寻找我们需要的MySQL
镜像
我们可以选择MySQL8
镜像,点击复制命令
在终端输入docker pull mysql:8.0
安装完成之后,输入docker images
,可以看到我们所有的镜像,当然也包括刚刚下载的MySQL
镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 4ddc4f9f1152 5 days ago 491MB
nginx 1.23.1-alpine 78eae2423184 6 weeks ago 22.1MB
mongo latest 8545a6005ade 4 months ago 665MB
使用命令新建MySQL
容器,可以修改命令中的数据库root密码MYSQL_ROOT_PASSWORD
sudo docker run --name=mysqldatabase -itd -p 0.0.0.0:3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08e0921058d8 mysql:8 "docker-entrypoint.s…" 19 seconds ago Up 19 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysqldatabase
可以看到已经成功新建MySQL
容器了,打开NaviCat
数据库管理工具链接MySQL
使用刚刚命令中的数据库密码链接数据库
到这里已经完成了数据库的安装
使用TypeORM
和mysql2
安装TypeORM
和mysql2
pnpm install --save @nestjs/typeorm typeorm mysql2
在module.ts
文件中添加@nestjs/typeorm
配置
在app.module.ts
添加配置代码,使用@nestjs/typeorm
连接MySQL
需要注意的是autoLoadEntities
和synchronize
都为true
的情况下,实体类才会同步到数据表
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'sys',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
autoLoadEntities: true, // 自动链接被 forFeature 注册的实体
synchronize: true, // 实体与表同步 调试模式下开始。不然会有强替换导致数据丢是
}),
UsersModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
随后修改user.module.ts
,添加@nestjs/typeorm
的配置,代码如下
需要注意的是,TypeOrmModule.forFeature
接收的参数是数据
import { User } from './entities/user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UsersController],
providers: [UsersService]
})
export class UsersModule {}
创建User的实体类
上一篇文章中,创建了curd
模块之后,其中也包括user.entity.ts
什么是entity,可以参考What is Entity? | TypeORM
按我的理解,就是描述数据库表字段的代码文件
User
的字段如下,有id
,昵称nickName
,姓名userName
,电话号码phoneNumber
,还有密码password
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
nickName: string;
@Column()
userName: string;
@Column()
phoneNumber: string;
@Column()
password: string;
@Column({ default: true })
isActive: boolean;
@Column('time')
createtime: string;
@Column('time')
updatetime: string;
}
重启项目后,打开Navicat
,可以看到已经在sys
库中新建了user
表了
接口代码修改
成功连上了数据库,也新建了user
表,接下来就是修改接口的代码,访问数据库的数据
首先编辑create-user.dto.ts
文件
export class CreateUserDto {
nickName: string;
userName: string;
phoneNumber: string;
password: string;
isActive: boolean;
createtime: string;
updatetime?: string;
}
还有update-user.dto.ts
,修改可以使用PartialType函数,可以直接继承CreateUserDto
import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';
export class UpdateUserDto extends PartialType(CreateUserDto) {}
补充DTO的解释
什么是DTO
呢?data transfer object
数据传输对象,简称DTO
,DTO
帮助我们定义系统内的接口或输入和输出。
查询接口
补充以下代码,使用typeorm
的方法查询数据库user
表中的数据
InjectRepository
方法需要传入User
实体类
Repository
也接收User
实体类
...
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm的';
import { User } from './entities/user.entity';
@Injectable()
export class UsersService {
constructor( @InjectRepository(User) private readonly userRepository: Repository<User> ) {}
async findAll() {
return await this.userRepository.find();
}
...
}
访问localhost:3003/users,可以看到接口已经返回了表的数据
新增修改接口service层代码
需要安装dayjs
,用于录入创建时间createtime
async create(createUserDto: CreateUserDto) {
const createtime = dayjs().format('YYYY-MM-DD HH:mm:ss');
createUserDto.createtime = createtime;
const user = await this.userRepository.save(createUserDto);
return this.userRepository.save(user);
}
async update(id: number, updateUserDto: UpdateUserDto) {
const updatetime = dayjs().format('YYYY-MM-DD HH:mm:ss');
updateUserDto.updatetime = updatetime;
const user = await this.userRepository.preload({
id: id,
...updateUserDto
});
if (!user) {
throw new Error(`未找到该用户数据`);
}
return this.userRepository.save(user);
}
详情和删除接口service层代码
需要注意的是TypeORM
升级到0.3.x
后,需要改用findOneBy
函数
async findOne(id: number) {
const user = await this.userRepository.findOneBy({
id: id,
});
return user
}
async remove(id: number) {
const user = await this.findOne(id)
if (!user) {
throw new Error(`未找到该用户数据`);
}
return this.userRepository.remove(user)
}
结语
写得不对的地方,欢迎各位点出,十分感谢
项目地址
nest-admin: 基于nestjs开发的管理系统后端项目代码 (gitee.com)
文章推荐
Nestjs入门,使用nest-cli创建项目并新建接口 - 掘金 (juejin.cn)
逃离土味团队和鲨鱼辣椒领导|2022年中总结 - 掘金 (juejin.cn)