Nest框架使用流程分析

最近使用了一个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中去写运行的一个逻辑

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

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

往期好文推荐

相关推荐
herogus丶4 分钟前
【Chrome】‘Good助手‘ 扩展程序使用介绍
前端·chrome
夕颜1116 分钟前
关于 Cursor 小插曲记录
后端
独立开阀者_FwtCoder7 分钟前
面试官:为什么在 Vue3 中 ref 变量要用 .value?
前端·javascript·vue.js
NetX行者10 分钟前
基于Vue 3的AI前端框架汇总及工具对比表
前端·vue.js·人工智能·前端框架·开源
考虑考虑10 分钟前
go中的Map
后端·程序员·go
独立开阀者_FwtCoder10 分钟前
手握两大前端框架,Vercel 再出手拿下 Nuxt.js,对前端有什么影响?
前端·javascript·vue.js
独立开阀者_FwtCoder11 分钟前
弃用 html2canvas!快 93 倍的截图神器!
前端·javascript·vue.js
weixin_3993806926 分钟前
TongWeb8.0.9.0.3部署后端应用,前端访问后端报405(by sy+lqw)
前端