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 功能不只是分发配置文档接口等功能了

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

相关推荐
亮子AI17 天前
【NestJS】为什么return不返回客户端?
前端·javascript·git·nestjs
小p17 天前
nestjs学习2:利用typescript改写express服务
nestjs
Eric_见嘉23 天前
NestJS 🧑‍🍳 厨子必修课(九):API 文档 Swagger
前端·后端·nestjs
XiaoYu20021 个月前
第3章 Nest.js拦截器
前端·ai编程·nestjs
XiaoYu20021 个月前
第2章 Nest.js入门
前端·ai编程·nestjs
实习生小黄1 个月前
NestJS 调试方案
后端·nestjs
当时只道寻常1 个月前
NestJS 如何配置环境变量
nestjs
濮水大叔2 个月前
VonaJS是如何做到文件级别精确HMR(热更新)的?
typescript·node.js·nestjs
ovensi2 个月前
告别笨重的 ELK,拥抱轻量级 PLG:NestJS 日志监控实战指南
nestjs