前言
开发过程中我们的 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
引入 controller
,controller
为我们的路由模块,主要用于分发路由给外部返回数据,一个模块可能功能很多,因此可能根据该模块功能不同分出来很多 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 功能不只是分发配置文档接口等功能了
个人觉得没有绝对对与错,只要使用没问题,那么就没问题,你觉得呢😂