最近使用了一个Nest的框架进行学习,对一些比较基础的和常用的功能做一些简单的记录,主要包括对项目的整个目录的介绍,各个模块的如何使用,入口,配置等文件的加载,项目如何启动,接口如何访问等方面来记录。
框架名称: Isme Nest Server
主要目录
.
上图是整个nest的src路径,
modules目录主要是保存一些主要逻辑,比如接口等查询逻辑的实现,
maints主要是项目的一个入口
app.modules配置项目需要调用到的模块
Main.ts
main.ts是整个项目的入口
使用npm run start:dev启动之后项目的入口就是这个地方,node会去创建一个进程来启动整个项目,这里的端口指定是8085,也可以使用process里面的配置
js
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as session from 'express-session';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(
session({
secret: 'isme',
name: 'isme.session',
rolling: true,
cookie: { maxAge: null },
resave: false,
saveUninitialized: true,
}),
);
await app.listen(process.env.APP_PORT || 8085);
console.log(`🚀 启动成功: http://localhost:${process.env.APP_PORT}`);
}
bootstrap();
app.modules
app.modules配置项目需要调用到的模块
比如user,permission,role,等接口逻辑,实现完之后会export进行导出,而整个app.modules是把这些模块接收到这里作为全局应用。
js
import { Module } from '@nestjs/common';
import { SharedModule } from './shared/shared.module';
import { ConfigModule } from '@nestjs/config';
import { UserModule } from './modules/user/user.module';
import { PermissionModule } from './modules/permission/permission.module';
import { RoleModule } from './modules/role/role.module';
@Module({
imports: [
/* 配置文件模块 */
ConfigModule.forRoot({
isGlobal: true,
envFilePath: ['.env.local', '.env'],
}),
UserModule,
PermissionModule,
RoleModule,
AuthModule,
],
})
export class AppModule {}
modules
可以看到app.modules引入的一些模块都是在src/modules这个目录里面写好的,按接口进行分类导出
user.modules
可以建一个role的目录来实现你的逻辑,需要包含的有三个,分别是controller,entity,modules,service
modules
是每个模块主要的导出文件,可以看到分别引入了,entity,service这三个主要模块
js
import { Module } from '@nestjs/common';
import { RoleService } from './role.service';
import { RoleController } from './role.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Role } from './role.entity';
import { Permission } from '@/modules/permission/permission.entity';
import { User } from '@/modules/user/user.entity';
@Module({
imports: [TypeOrmModule.forFeature([Role, Permission, User])],
controllers: [RoleController],
providers: [RoleService],
})
export class RoleModule {}
user.controller
controller
是接口的入口 ,比如访问 /role/page
来访问某个接口,也就是service里面的逻辑
js
import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
UseGuards,
Query,
Request,
} from '@nestjs/common';
import { RoleService } from './role.service';
import {
AddRolePermissionsDto,
AddRoleUsersDto,
CreateRoleDto,
GetRolesDto,
QueryRoleDto,
UpdateRoleDto,
} from './dto';
import { JwtGuard, PreviewGuard, RoleGuard } from '@/common/guards';
import { Roles } from '@/common/decorators/roles.decorator';
@Controller('role')
@UseGuards(JwtGuard, RoleGuard)
export class RoleController {
constructor(private readonly roleService: RoleService) {}
@Post()
@UseGuards(PreviewGuard)
@Roles('SUPER_ADMIN')
create(@Body() createRoleDto: CreateRoleDto) {
return this.roleService.create(createRoleDto);
}
@Get()
findAll(@Query() query: GetRolesDto) {
return this.roleService.findAll(query);
}
@Get('page')
findPagination(@Query() queryDto: QueryRoleDto) {
return this.roleService.findPagination(queryDto);
}
user.service
service是书写接口逻辑的主要文件,需要查表或者获取数据等操作都是通过service来进行操作,比如这里面实现了create的创建用户的一个逻辑。
js
import { InjectRepository } from '@nestjs/typeorm';
import { In, Like, Repository } from 'typeorm';
import { Role } from './role.entity';
import { Permission } from '@/modules/permission/permission.entity';
import { SharedService } from '@/shared/shared.service';
import { User } from '@/modules/user/user.entity';
@Injectable()
export class RoleService {
constructor(
private readonly sharedService: SharedService,
@InjectRepository(Role) private roleRepo: Repository<Role>,
@InjectRepository(Permission)
private permissionRepo: Repository<Permission>,
@InjectRepository(User) private userRepo: Repository<User>,
) {}
async create(createRoleDto: CreateRoleDto) {
const existRole = await this.roleRepo.findOne({
where: [{ name: createRoleDto.name }, { code: createRoleDto.code }],
});
if (existRole) throw new BadRequestException('角色已存在(角色名和角色编码不能重复)');
const role = this.roleRepo.create(createRoleDto);
if (createRoleDto.permissionIds) {
role.permissions = await this.permissionRepo.find({
where: { id: In(createRoleDto.permissionIds) },
});
}
return this.roleRepo.save(role);
}
总结
以上三个user的模块就是一个主要的操作流程,从modules里面去注入模块,controller去暴露一个接口供外部调用,最后在service中去写运行的一个逻辑
本文主要简单记录一下我的一个框架的学习流程。