最近在学习神光大神的《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<User>;
create(createUserDto: CreateUserDto) {
this.userRepository.save(createUserDto);
// this.manager.save(User, createUserDto);
}
// ...
}
基于以上,咱们就在nest中完成了一个基本的CRUD操作,并且和mysql进行了连接。你能够在此基础上做更复杂的业务,甚至做前后端联调。