最近在学习神光大神的《Nest通关秘籍》,接下来的日子里,我将更新一系列的学习笔记。
感兴趣的可以关注我的专栏《Nest 通关秘籍》学习总结。
特别申明:本系列文章已经经过作者本人的允许。
大家也不要想着白嫖,此笔记只是个人学习记录,不是非常完善,如想深入学习可以去购买原版小册,购买链接点击《传送门》。
本章我们来学习一下如何在Nest中集成TypeORM。
创建nest项目
nest new nest-typeorm -p pnpm
创建一个 crud 的模块:
nest g resource user
引入 typeorm:
npm install --save @nestjs/typeorm typeorm mysql2
在入口引入数据配置:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user/entities/user.entity';
@Module({
imports: [
UserModule,
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'xxxxxx',
database: 'typeorm_test',
synchronize: true,
logging: true,
entities: [User],
poolSize: 10,
connectorPackage: 'mysql2',
extra: {
authPlugin: 'sha256_password',
},
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
注意提前创建typeorm_test
数据库。
在 User 的 Entity 里添加映射信息:
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity({
name: 'user',
})
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({
comment: '姓名',
length: 50,
})
name: string;
}
运行项目:
npm run start:watch
可以看到建表语句。在数据库中也生成了user
表和插入了对应的字段:
接下来我们做一些增删改查的操作。
首先在user表中,我们手动插入一条数据:
注入 EntityManager,实现增删改查的操作:
import { Injectable } from '@nestjs/common';
import { InjectEntityManager } from '@nestjs/typeorm';
import { EntityManager } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './entities/user.entity';
@Injectable()
export class UserService {
@InjectEntityManager()
private manager: EntityManager;
// 增加
create(createUserDto: CreateUserDto) {
this.manager.save(User, createUserDto);
}
// 查找
findAll() {
return this.manager.find(User);
}
// 查找单个
findOne(id: number) {
return this.manager.findOne(User, {
where: { id },
});
}
// 修改
update(id: number, updateUserDto: UpdateUserDto) {
this.manager.save(User, {
id: id,
...updateUserDto,
});
}
// 删除
remove(id: number) {
this.manager.delete(User, id);
}
}
打开apifox,来测试一下。
1.查询接口
输入:http://localhost:3000/user
返回结果为数组。
输入:http://localhost:3000/user/1
返回结果为单个对象。
2.新增接口
输入:http://localhost:3000/user
方法POST
,参数为Body
形式,输入name
数据库插入了一条数据:
3.修改接口
输入:http://localhost:3000/user/3
方法为PATCH
,参数为Body
形式,输入name
数据库中的数据发生了改变:
4.删除接口
输入:http://localhost:3000/user/3
方法为DELETE
id=3
的一条数据被删除了。
至此,我们就正式打通了从请求到数据库的整个流程!
现在我们直接用 EntityManager
的缺点是每个 api 都要带上对应的 Entity
Nest 做了封装,在 user 模块可以引入 TypeOrmModule.forFeature
对应的动态模块,传入 User 的 Entity
:
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
然后在模块里注入 Repository :
import { Injectable } from '@nestjs/common';
import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
import { EntityManager, Repository } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './entities/user.entity';
@Injectable()
export class UserService {
@InjectEntityManager()
private manager: EntityManager;
@InjectRepository(User)
private userRepository: Repository;
create(createUserDto: CreateUserDto) {
this.userRepository.save(createUserDto);
// this.manager.save(User, createUserDto);
}
// ...
}
基于以上,我们就在nest中实现了一个基本的CRUD操作,并且和mysql进行了连接。你可以在此基础上做更复杂的业务,甚至做前后端联调。