本文主要对NestJS相关做一下整理,正式开始之前先介绍一下当前使用场景。
BFF架构
这里先介绍一下当前相关架构
这里的项目指的是一个toc的控制台,包含web和小程序两端,由于两端的页面有所差异,因此所需字段也有所区别,再加上同一个数据可能来自于多个接口,因此引入了BFF层进行接口聚合和适配。
其他部分,api网关会接收所有处理,如果需要认证先经过认证处理后返回到网关,然后转发给bff,否则直接发到bff,然后再由bff访问具体的服务。
bff层使用的NestJS框架,因为
- 对ts支持较好
- 比较成熟,兼容express的插件,生态较好
- 可扩展性好,提供了很多开箱即用的功能,比如微服务等
NestJS
nodejs提供了http模块用来监听端口,处理请求和返回响应,为了简化这一过程出现了express或koa等框架,但是这类框架也仅仅做了这些,没有解决架构问题。
因此我们这里使用了NestJS,其底层使用了express(还可以是fastify),因此可以直接发挥express及其生态的优势。
相关概念
NestJS中module类似于ui中的组件,每个应用至少包含一个root module,还可能包含其他feature module,不同module都在父级module注册,最终组合成整个应用。
为了更好的处理请求响应过程,nest引入了很多概念
- middleware 类似于express的middleware,在收到请求和router处理之前调用,可以访问请求和响应对象,可以用来更改两个对象或者提前结束。
- guard 用来鉴权,在middleware之后,interceptor or pipe之前调用
- interceptor 在请求处理之前和之后执行指定逻辑
- pipe 用来转换数据和验证数据
- exception filter 用来捕获应用中未处理的异常,从而给用户对应提示
除了以上直接参与请求响应的,NestJS还有一个重要概念,即provider,我们可以用来将class依赖注入,即注册后由系统自动实例化,最常见的就是service,可以为controller处理具体的逻辑,比如crud。
除了注入class,还可以注入常量或工厂函数等。
其他
除了以上基本操作,NestJS还对其他功能进行了集成,比如数据库、配置等。