注:我们按照上一章已结连接到数据库了,这里先简单创建一个表,先熟悉CRUD的写法。
1、创建实体类
src目录下创建一个entities目录,在entities目录下创建一个user.entity.ts实体类
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
// 装饰器
@Entity()
export class User{
//自增主键装饰器
@PrimaryGeneratedColumn()
id:number;
@Column()
name:string;
@Column()
password:string;
}
注:实体类都要有一个主键属性
2、映射实体类到数据库
在app.module中引入实体类
import { User } from './entities/user.entity';
在TypeOrmModule中的entities属性注册
TypeOrmModule.forRootAsync({
imports:[ConfigModule],
inject:[ConfigService],
useFactory: (configService:ConfigService)=>
({
type:configService.get(EnumConfig.DB_TYPE),
host: configService.get(EnumConfig.DB_HOST),
port:configService.get(EnumConfig.DB_PORT),
username: configService.get(EnumConfig.DB_USERNAME),
password: configService.get(EnumConfig.DB_PASSWORD),
database: configService.get(EnumConfig.DB_DATABASE),
timezone: 'UTC',
charset: 'utf8mb4',
entities:[User],
synchronize:configService.get(EnumConfig.DB_SYNC),
logging:process.env.NODE_ENV === 'development'
} as TypeOrmModuleAsyncOptions)
})
启动服务,此时数据库就映射到这个表
3、创建实体类模块
使用命令行创建模块
nest g mo user//创建user.module
nest g s user//创建user.service
nest g co user //创建user.controller
在module文件内引入需要使用的表
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { User } from 'src/entities/user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
// 引入需要使用的实体
imports:[TypeOrmModule.forFeature([User])],
providers: [UserService],
controllers: [UserController]
})
export class UserModule {}
service文件中,在构造函数中注入依赖
constructor(
@InjectRepository(User) private readonly userRepository:Repository<User>
){}
注:使用 @InjectRepository()
装饰器,你可以将 repository 作为一个依赖项注入到你的服务(Service)或控制器(Controller)中。这使得你可以在 NestJS 模块中方便地访问和操作数据库。Repository 是 TypeORM 中的一个核心概念,它提供了一种与数据库表交互的方法,包括执行 CRUD 操作。
4、引入接口文档swagger
安装swagger
npm install @nestjs/swagger swagger-ui-express
mian.ts文件中引入
const docOptions = new DocumentBuilder().setTitle('STUDY_DOC').setDescription('沉迷学习无法自拔').setVersion('1').build()
const document = SwaggerModule.createDocument(app,docOptions)
//设置访问路径
SwaggerModule.setup('/api-docs',app,document)
配置分区,使用ApiTags
@Controller('user')
@ApiTags('User')
export class UserController {
constructor(
private readonly userService:UserService
){}
....
配置接口描述
@Get()
@ApiOperation({description:"查询所有用户"})
async queryUser(){
return await this.userService.readUsers()
}
启动服务,访问文档
5、CRUD
src下添加一个interface目录,添加一个接口user.interface.ts
export interface UserInterface{
id?:number;
name:string;
password:string;
}
添加
//service
async createUser(data:UserInterface){
const user = new User();
user.name = data.name;
user.password = data.password
return await this.userRepository.save(user)
}
//controller
@Get('add')
@ApiOperation({description:"添加一个用户"})
async addUser(){
let data = {name:'xue',password:'xue'}
return await this.userService.createUser(data);
}
查询
//service
async readUsers(){
return await this.userRepository.find();
}
//controller
@Get()
@ApiOperation({description:"查询所有用户"})
async queryUser(){
return await this.userService.readUsers()
}
修改
//service
async updatedUser(id:number,data:UserInterface) {
const user = new User();
user.name = data.name;
user.password = data.password;
user.id =id;
return await this.userRepository.save(user)
}
//controller
@Get('update/:id')
@ApiOperation({description:"修改用户"})
async updatedUser(@Param('id') id) {
let data = {name:'xue1',password:'xue2'}
return this.userService.updatedUser(id,data)
}
删除
//service
async deleteUser(id:number){
return await this.userRepository.delete(id)
}
//controller
@Get('del/:id')
@ApiOperation({description:"删除一个用户"})
async moveUser(@Param('id') id){
return this.userService.deleteUser(id)
}
6、完整代码
user.module
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { User } from 'src/entities/user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
// 引入需要使用的实体
imports:[TypeOrmModule.forFeature([User])],
providers: [UserService],
controllers: [UserController]
})
export class UserModule {}
user.service
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from 'src/entities/user.entity';
import { UserInterface } from 'src/interface/user.interface';
import { Repository } from 'typeorm';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User) private readonly userRepository:Repository<User>
){}
// create
async createUser(data:UserInterface){
const user = new User();
user.name = data.name;
user.password = data.password
return await this.userRepository.save(user)
}
// read
async readUsers(){
return await this.userRepository.find();
}
// update
async updatedUser(id:number,data:UserInterface) {
const user = new User();
user.name = data.name;
user.password = data.password;
user.id =id;
return await this.userRepository.save(user)
}
// delete
async deleteUser(id:number){
return await this.userRepository.delete(id)
}
}
user.controller
import { Controller, Get, Param, Post } from '@nestjs/common';
import { ApiOperation, ApiParam, ApiTags } from '@nestjs/swagger';
import { UserService } from './user.service';
@Controller('user')
@ApiTags('User')
export class UserController {
constructor(
private readonly userService:UserService
){}
@Get()
@ApiOperation({description:"查询所有用户"})
async queryUser(){
return await this.userService.readUsers()
}
@Get('add')
@ApiOperation({description:"添加一个用户"})
async addUser(){
let data = {name:'xue',password:'xue'}
return await this.userService.createUser(data);
}
@Get('update/:id')
@ApiOperation({description:"修改用户"})
async updatedUser(@Param('id') id) {
let data = {name:'xue1',password:'xue2'}
return this.userService.updatedUser(id,data)
}
@Get('del/:id')
@ApiOperation({description:"删除一个用户"})
async moveUser(@Param('id') id){
return this.userService.deleteUser(id)
}
}