likes
comments
collection
share

Nest框架使用流程分析

作者站长头像
站长
· 阅读数 7

最近使用了一个Nest的框架进行学习,对一些比较基础的和常用的功能做一些简单的记录,主要包括对项目的整个目录的介绍,各个模块的如何使用,入口,配置等文件的加载,项目如何启动,接口如何访问等方面来记录。

框架名称: Isme Nest Server

主要目录

Nest框架使用流程分析 .

上图是整个nest的src路径,

modules目录主要是保存一些主要逻辑,比如接口等查询逻辑的实现,

maints主要是项目的一个入口

app.modules配置项目需要调用到的模块

Main.ts

main.ts是整个项目的入口

使用npm run start:dev启动之后项目的入口就是这个地方,node会去创建一个进程来启动整个项目,这里的端口指定是8085,也可以使用process里面的配置

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是把这些模块接收到这里作为全局应用。


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这个目录里面写好的,按接口进行分类导出

Nest框架使用流程分析

user.modules

可以建一个role的目录来实现你的逻辑,需要包含的有三个,分别是controller,entity,modules,service

Nest框架使用流程分析

modules是每个模块主要的导出文件,可以看到分别引入了,entity,service这三个主要模块

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里面的逻辑

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的创建用户的一个逻辑。

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中去写运行的一个逻辑

本文主要简单记录一下我的一个框架的学习流程。

如果觉得有趣或有收获,请关注我的更新,给个喜欢和分享。您的支持是我写作的最大动力!

往期好文推荐