Nestjs入门,使用TypeORM连接MySQL
前言
从上一篇文章中,已经搭建了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)
文章推荐
转载自:https://juejin.cn/post/7140081041041489934