前情提要:最近的一个月我开始转型做了基于nest.js的服务端的一个抽奖活动,借此分享一下。
内 容:本文基于官网例子写了注解,**仅涉及到nest.js的入门使用和概念了解**。
目 的:**把nest.js常用的几个概念简单的串起来,让没有接触过的人了解下。
相关文档**:英文文档 - 链接中文文档 - 链接

其他说明:nest.js是我接触地最认真的一个node.js框架,虽然我也简单地使用过express.js,koa.js··· ···但是这里我并不想过多地介绍他们之间的区别和联系,也许我会单独用一篇文章分享一下(前提是我需要多搜集资料了解哈)。

本文将按照以下逻辑介绍:

  • 一个最简单的请求
  • 一个稍微复杂的请求
  • 不得不提的“干”概念
  • 真正完整的一套请求

概述

当我们使用nest.js的时候,我们不需要过分关心他的底层逻辑是什么,他已经和我们封装地非常灵活了;但如果我们就想要通过nest.js使用某个更加底层的框架,比如express.js,也可以通过声明做到。

主要的分享

下面我主要介绍的是nest.js在开发中会频繁接触到的一些知识点:controller、privider、module、middleware、exception filter、pipe、guard、interceptor以及decotator。

一个最简单的请求

安装啥的直接过,我们直接从第一个简单的请求开始。(请仔细看图和图注解)
image.png
上图是我借官网的一个例子写的注解。在nest.js中我们可以使用大量他已经封装好的装饰器(Decorator),也可以自行封装装饰器。装饰器的目的主要就是让代码更加清晰明了,他是具体class的语法糖,很好用,很上头,很好看。

当我们定义好一组控制器(Controller),nest.js的路由机制就会自动帮助我们进行映射。
对应的请求直上直下,非常清晰:
POST: cats -> 无其他路径 -> 请求 create方法 -> 返回相应的值(上图左侧紫色箭头)
GET : cats -> 无其他路径 -> 请求 findAll方法 -> 返回相应的值(上图左侧黄色箭头)
如果想获取vivi这只猫咪的信息,就在@GET(‘vivi’)即可。

为了让功能更加明确、代码更加明晰,我们通常会将类似功能/主体的代码放在一起,以上就是将于cats(猫咪)相关的操作、路由放在了一起,都在cats.controller.ts的文件夹内。具体说就是,新建一个小猫咪、删除一个小猫咪、给某个小猫咪改名字、查询所有小猫咪,所有和小猫咪相关的请求我们都放到了cats.controller.ts文件内。

获取请求参数、设置cats/xxx其他的路径、动态路由、设置其他的http请求都是可以的,基本上都可以通过内置的装饰器实现,以下是一个完整的简单例子(随意扫过就行)。
image.png

一个稍微复杂的请求

如果我们是在做项目,那一般来说都属于微复杂的请求了,所以一般都是如此使用。我们不会将请求具体的处理情况交给Conroller了,而是把他放到单独的文件Provider(提供者)内,减轻Controller的压力,专人专职。

只要在Controller内告诉他,我需要Provider的协助,接下来我们就可以在相应的Provider内根据功能做“任何”可做的事情,还可以引用公共部分的Provider帮忙做事情。
一个Controller可以对应多个Provider,根据功能给Provider分类,取个好名字就好。

首先是要在Controller中间定义,通知Controller接下来的处理是某Provider的的。(左图)
其次是要在Provider 内实现具体方法。(右图)
image.pngimage.png
(还有其他的service的声明方式,里面关于XXDto,是通过ts定义的请求/相应的数据类型,属于ts的范畴了)

这也算是一个完整的、通常使用的请求模式-响应模式了。(响应还可以自定义如上图的标准模式,还是使用具体库例如express.js的模式,当然还可以自定义相应头部、http code、http status等内容了)

以上在Controller里面引用CatSService就是一个依赖注入的例子,这个也是nest.js的一个重要的概念。

不得不单独提出来的“干”概念

上面我们只定义了一组路由和他的实现方法,相当于在无风地区造了一个风车,没有风,他就无法动起来,所以就必须单独提出模块(Module)这个概念。

在Module中,我们可以定义Controller和它对应的Provider,我们也可以导出Provider和引入需要的公共的其他模块的Provider来使用,前提必须是所有的入口都必须在Module内定义好了,才可以正常使用。

image.png
(模块也分公共模块、普通模块、模块的定义也可以有不同的形式,上图是通过装饰器@Module定义的Cats模块)

真正完整的一套请求

上面只是简单的告诉了Module的定义,已经请求走过Controller和Provider就完成了他的任务,但是在实际应用中我们会遇到很多突发情况:

  • 管理系统后台一般会有多种用户角色,制定用户只能访问指定路由,该如何管理?
  • 如果在处理的途中遇到错误,该如何自处?
  • 每个公司一般有专门定义的统一的请求返回内容,该如何处理?
  • 一些公有的或者想提出去的验证接口该如何处理?
  • 如果请求有多重验证,该如何处理?
  • … …

以上的内容,nest.js都有对应的处理方法,我们还是已图示来告诉大家,当一个请求过来了,我们可以如何通过nest.js完整的管理、处理他。(假设我们已经依照官网定义了相关的内容)

点击下面的image.png可全屏查看!

nest.js飞速入门 - 图7 啊!
以上!