nestjs-module模块简介

前言

开发过程中我们的 Module 文件,其用来配置我们这个模块需要用到的东西和对外导出的功能,如果单纯的开发,可能我们就导入一个数据库就行了,如果功能复杂的模块则可能模块之间有交互呢,那么我们怎么配置,下面简单讲解一下

module介绍

案例

下面就给出一个案例,就是常用的一些导入了,我们简单介绍回顾下

js 复制代码
@Module({
    //导入其他模块
    imports: [
        TypeOrmModule.forFeature([User]),
        TypeOrmModule.forFeature([File]),
    ],
    //导入该模块需要的控制器,包括其他模块的控制器
    controllers: [UserController],
    //导入该模块需要的service
    providers: [UserService, FileService, MinioService],
    //该模块有外部需要用到的服务,对外导出,否则外部不能正常使用
    exports: [TemplateService],
})

imports

imports 用于导入用到的其他模块,常见的就是数据库、jwt 等模块等,也可以导入我们自己的模块,这样就不用导入该模块的引用的 service 了(当然建议 service 一个一个引入,能看出来该模块与那些具体服务耦合)

js 复制代码
imports: [
    TypeOrmModule.forFeature([User]),
    TypeOrmModule.forFeature([Auth]),
    JwtModule.register({
      global: true, //设置为全局
      secret: envConfig.secret,
      signOptions: {
        expiresIn: '7d', //失效时长设置为7天
      },
    }),
    //引用自己的模块,可以避免引入该模块的 service ,当然建议 service 一个一个引入,能看出来该模块与那些具体服务耦合
    ArticleModule,
  ],

controllers

引入 controllercontroller为我们的路由模块,主要用于分发路由给外部返回数据,一个模块可能功能很多,因此可能根据该模块功能不同分出来很多 controller,需要将我们用到的 controller 全部引入,不然该 controller 会不生效

例如:我们的 user 模块有基础功能增删改查(UserController),后面还增加了,同类用户不同用户之间的各种业务关系操作(UserRelationController)

js 复制代码
    controllers: [UserController, UserRelationController],

providers

providers 就是我们使用的 servie,每个 controller 都会对应一个至多个 service,其主要用来编写我们的业务服务,如果我们用到其他模块的 service, 需要在这里加入其 service(其他模块要 exports导出),以便于调用其他模块的方法

并且里面有我们配置全局校验 Guard 的设置,其为固定格式

js 复制代码
providers: [
    UserService, 
    AuthService,
    ArticleService,
    //全局校验 guard 配置,固定写法,下面为校验类
    {
      provide: APP_GUARD,
      useClass: UserGuard,
    },
  ],

exports

看名字就知道对外导出,外部模块用到本模块的 service 时,会在其模块的 providers 中加入本模块 servier,如果本模块没有对外导出 exports 的话,那么就会调用失败(最简单的报错),因此我们的 service 如果有对外使用的模块,需要将该 service 模块导出

js 复制代码
  exports: [
    FileService, 
    FileExService,
    MinioService,
    RedisService,
  ]

service之间调用

平时写后台,平时能一个方法写完业务就写完,尽量避免函数的来回调用,浪费性能,因此非必要的提取操作我们可能不会做,因此导出我们可能感觉用不到,主要是因为模块之间交互不够,如果存在交互,那么就需要使用导入、导出功能可

前面也介绍了,本模块要用到其他 service,首先其他 service 需要 exports 其 service,然后本模块引用其 service,然后调用其写好的方法即可

js 复制代码
//ArticleService
//假设外部需要调用我们的 ArticleService,调用我们的 find 方法查找该文章是否存在
//如果我们文章存在假删除、是否允许查看,那么我们外部调用时就可能需要同时where对比这些参数
//这样外部使用时基础功能时,会引入一些不方便更改的代码(假设我们又加入、删除一个过滤参数,外部还得一个一个找)
//如果这类代码写到本 service 至少维护会好很多,因此可能会需要用到对外导入
//当然也会有些创建等操作也可以

//假设外部需要调用查找
find(id: string) {
    return this.ArticleRepository.findOneBy({
        id,
        is_allow: 1,
        usable: 1,
    })
}

//假设外部需要调用创建
create() {
    const article = new Article()
    ...
    return this.ArticleRepository.save(article)
}

最后

有些人觉得 service 应该仅仅处理一些基础逻辑,controller 除了分发路由,给客户端返回的加工在 controller应该在 controller 加工

然而我不这么认为,如果真想功能解耦,不是在于该写到哪里,service 服务,就应该该出一个完整的功能,当我们写一个 service 时,除了正确内容,也应该把错误内容返回给对方,这样其他模块也能获取到我们给出的错误码和应该提示的错误信息(只返回基础信息,那么错误信息还需要再其他模块书写,这样文案就会跨模块了),而写到 controller就相当于掉接口了,功能不全面,且 controller 功能不只是分发配置文档接口等功能了

个人觉得没有绝对对与错,只要使用没问题,那么就没问题,你觉得呢😂

相关推荐
Spirited_Away3 天前
Nest世界中的AOP
前端·node.js·nestjs
Eric_见嘉9 天前
NestJS 🧑‍🍳 厨子必修课(六):Prisma 集成(下)
前端·后端·nestjs
kongxx25 天前
NestJS中使用Guard实现路由保护
nestjs
白雾茫茫丶1 个月前
Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter
nestjs·nest.js·发布订阅·event emitter
lph65822 个月前
比起上传资源更应该懂得如何资源回收
node.js·nestjs
gsls2008082 个月前
将nestjs项目迁移到阿里云函数
阿里云·云计算·nestjs·云函数
d3126975102 个月前
在Nestjs使用mysql和typeorm
mysql·express·nestjs·typeorm
剪刀石头布啊2 个月前
nestjs-版本控制
nestjs
潇洒哥gg3 个月前
重生之我在NestJS中使用jwt鉴权
前端·javascript·nestjs
huangkaihao3 个月前
【NestJS学习笔记】 之 自定义装饰器
前端·node.js·nestjs