哈喽哈喽,我是你们的金樽清酒。眨眼间,2024年就过去了。这是充满挑战性的一年,无论如何都平安落地了。先祝大家新的一年平安喜乐。新的一年呢,肯定是越来越好。就这个日子,适合学点红色的东西,那么好nestJS就决定是你啦。这是我关于nestJS的第二篇文章,也是我向吹的牛逼实现的又一步。话不多说,2025年就一个字,干就完了。
今天我们的主角是controller控制器
什么是控制器?
我们看一下官方的这张图。控制器就是处理参数和路由的。客户端发送一个请求给某一个控制器,控制器来解析客户端给的参数和控制路由,返回结果给客户端。显然,控制器的地位非同小可。值得我们花一些时间去学习。那我们学习的路径的就跟着官方的目录去学习。一个个逐一突破。你说为啥不直接看文档,还看我文章,那不是怕你懒不打开文档嘛。那先贴一个文档吧NestJS中文文档。
抓紧,马上要发车了,快点坐好,小朋友系好安全带。
控制器的路由
什么是路由,就拿我掘金主页来说juejin.cn/creator/hom… ,路由就是导航栏的地址,指向了具体的资源的位置。我们前端跟后端对接的时候后端都会给我们一个文档。告诉我们访问的地址,如/creator/home。前面的https://juejin.cn在我们封装axios的时候,封装在baseUrl里面。实际上是要访问完整地址的。
在nestjs当中我们可以用@controller装饰器,这是定义装饰器所必须的。在里面加上路由参数,可以统一配置路由,不必在每个文件每个方法里面单独添加路径前缀。我就直接用官方的例子吧。
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
我直接洗个简单的fetch请求验证一下 这是前端
这是后端
前端访问的是后端起的服务'http://localhost:3000/cats',
可以看到我们配置的前缀成功了,那后面我们配置的cats前缀的请求方法也可以放在这个controller里面。
@post修饰器里面再加参数可以配置子路由。它将跟控制器装饰器里面的参数结合共同映射成路由。这样子你是不是就会写一些简单的参数啦。
简单的加一个参数
看到上面的状态码了嘛。一般请求成功的状态码是200,但是post方法是个例外,它是201,但是我们也可以自定义状态码。
文档里面是有解释的,而且还解释了返回的响应体。如果是简单数据类型则不会序列化,如果是对象类型那就是会自动序列化,正常来说我们是在service层写返回数据的方法的。然后在controller层调用。
look at this。我在service层里面的getHello方法里面返回的是一个对象,然后在controller层调用,看看响应体。
它会自动序列化,返回的是一个json对象。
请求对象
Nest 提供对底层平台 请求对象 的访问(默认为 Express),怎么用呢,可以通过将@Req装饰器添加到处理程序的签名,来指示nest注入它访问请求对象。包括请求的参数,字符串,请求头之类的,就是访问请求客户端的请求头体等信息。如果学习过express的同学可能了解,但是我没咋学过,直接nest起步的。
这是express文档里面的解释。nest就是允许你访问这些底层方法对象。
但是大可不必这么麻烦,既然封装了,@Body和@Query等对象可以帮我们达到同样的效果。
资源
别看文档写的这么文邹邹的,其实就是告诉我们有不同的装饰器提供不同的http请求方法。
路由通配符
你又别看它文邹邹的,其实就是可以代替任意字符,包括啥也没有,比如那个abcd,就把当空气了。通配符代表所有,在前端很多的地方,比如css中的*。你又乱用通配符出错了吧,在写css的时候。
状态码
状态码也没有很多要讲的地方,无非就是post与众不同,状态码是201.然后可以用@HttpCode装饰器来修改状态码。
响应头
可以通过@Header装饰器来定义响应头的内容,Cache-Control这个响应头不陌生了吧。控制浏览器缓存的,值为none就是不开启缓存。
重定向
这个没啥好说的吧,@Redirect装饰器后面接重定向的地址和状态码。
但是我尝试的时候跨域了
很显然嘛,协议名都不一样。
还有一个动态设定重定向地址的问题
路由参数
这个我们简单的解释一下,当url中有参数的时候,可以在装饰器里面写一个参数标记,如:id。然后在方法参数里面用@Param来获取。在实际应用场景当中呢就像get方法传参不是在url里面嘛,用这种方法获取到客户端传来的参数。
它还有另一种写法
注意哦,带参数的路由应在任何静态路径之后声明。这可以防止参数化路径拦截发往静态路径的流量。
以后实战的时候再着重强调一下吧。
子域路由
怎么解释呢,就是在@Controller装饰器里面配置host,允许某一台特定的ip访问。它也可以动态的获取。
作用域
作用域这玩意我不懂,主要没有接触过其他后端语言。先埋个点,后面再补充。
异步性
请求负载
请求负载其实就是你传给后端的请求体。请求体里面不是限定了哪些字段嘛。那你后端肯定得定义,一般用ts进行类型限定嘛,那我们就要创建一个DTO,叫数据传输对象,推荐用类而不是接口创建。其实接口也是一个十分抽象的类罢了,但是类是js中存在的,接口是ts中才有的,但是接口在转换的过程中会被删除,导致nest无法被正确的引用,所以推荐用类。
错误处理
在文档中有单独的章节,后续会进行补充。
完整资源样本
这个看看就好,就是总共有哪些请求方法,包括如何处理参数
启动并运行
就单单的在nest中声明一个Controller并不能运行,因为加载不到这个模块。我们在main.ts是引用了Module模块,在module模块下我们还要声明一下controller模块,这样在从入口文件读到module文件,又从moudule文件读到我们的Controller文件。这不就是模块化的核心嘛。你看像不像webpack的工作原理。
特定于库的方法
nest有很多的装饰器来完成各种各样的功能。但是它的底层基于express等框架。你也可以访问底库的方法来书写。
总结
装饰器是用来处理参数和管理路由的。其实的核心是@Controller装饰器。可以配置路由前缀。一个装饰器里面可以放置各种请求。还能处理参数。重定向路由等等。你会发现,我们很多的功能都是用它封装好的装饰器。说明nest十分的简单易上手。当然也可以采用原生的库方法来书写代码。好啦,新的一年,祝大家平安顺遂,万事如意。可能这篇文章有点草率,因为我没有实战支撑嘛。以后补上。