在此之前,项目中使用的各种 @Inject
@Controller
等以 @
开头的都是装饰器,这里对使用中常用的装饰器进行进一步认识。
模块之间常用装饰器
模块装饰器
@Module
声明模块
@Controller
、@Injectable
分别声明其中的 controller 和 provider(service)
其中 @Injectable
可以在任意一个 class 中声明
useFactory
useValue
声明 provider
@Inject
注入指定 token
constructor
中的对象实例也可以手动使用 @Inject
注入
@Optional
可选注入
@Global
声明为全局 Module
当存在模块会在大部分其它模块中引入时,声明为全局 Module,就可以少一步 imports
AOP 装饰器
@Catch
是异常过滤器 Exception Filter 中,指定捕获异常类型的注解@UseFilter
是使用异常过滤器的注解
@UseGuards
@UsePipes
@UseInterceptors
,使用方式和@UseFilter
一样。
此处的更多内容可阅读上一篇文章:Nestjs系列 Nestjs中的AOP架构
@SetMetadata
可以使用 @SetMetadata()
装饰器来为路由处理方法设置元数据
请求方式常用装饰器
请求 Method
-
@Get
@Post
@Patch
@Put
@Delete
@Options
@Head
,这些顾名思义,都是前端可传入的 method 类型 -
@Param
UrlParam 参数
当传入动态 urlParam 时,比如 /person/1
/person/2
这种动态 url 参数
@Body
可以获取请求体中的参数
@Query
可以接收 query param 请求参数
请求信息常用装饰器
@Headers
获取请求头的所有信息或者某个信息
@Ip
拿到请求的 ip
@Session
拿到 session 对象
@Get()
findAll(@Session() session) {
return { session };
}
当然,直接取 session 是没有值的,因为 session 是存储在服务端的,而服务端没有执行存储 session 的操作,自然没有数据
安装 express-session
插件
pnpm i express-session
pnpm i @types/express-session -D # ts类型
@HostParam
取 host 里的参数
@Controller
可以指定访问的 host 地址,只有当 host 满足 xx.0.0.1
时才可以访问
@HostParam
获取 host 对象
@Req
,获取整个 request 对象,上边的几个装饰器,数据都可以从 request 中获取
@Res
注入的 response 对象较为特殊,如果注入却没有使用 response 进行返回,Nest 也不会自动返回响应内容,必须手动response.json('my response');
这样的作用就是为了防止自己注入使用的 response 和 Nest 本身的响应冲突
@Next
注入时,也不会主动返回响应,其作用就是转发给下一个同名路由的 handler
@HttpCode
默认情况下,所有正常响应的 handler 返回的状态码都是 200,可以使用@HttpCode
指定返回的状态码
@Header
,可以自定义返回的 header 数据@Header
是自定义添加请求头返回响应,而@Headers
是读请求中的 header
@Redirect
路由重定向,即访问某个路由时,重定向到指定地址
重定向的地址也可以写在响应中
模板引擎渲染HTML视图
就相当于请求路由返回的不是 json 数据,而是一个网页内容。更多可参考 Nest 中文网-模板渲染
- 安装 模板引擎 来渲染 HTML 视图
npm install hbs
- 配置 express 实例
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
app.useStaticAssets(join(__dirname, '..', 'public'));
app.setBaseViewsDir(join(__dirname, '..', 'views'));
app.setViewEngine('hbs');
await app.listen(3000);
}
告诉 Express,public
目录将用于存储静态资源,views
将包含模板,而 hbs
模板引擎应该用于渲染 HTML 输出
此时访问 /person 路由
总结
- @Module: 声明 Nest 模块
- @Controller:声明模块里的 controller
- @Injectable:声明模块里可以注入的 provider
- @Inject:通过 token 手动指定注入的 provider,token 可以是 class 或者 string
- @Optional:声明注入的 provider 是可选的,可以为空。当该注解修饰的参数没有传入值时,NestJS 将给该参数提供一个默认值 null,并且不会抛出任何异
- @Global:声明全局模块,其余模块无需 imports 导入即可注入使用
- @Catch:声明 exception filter 处理的 exception 类型
- @UseFilters:路由级别使用 exception filter
- @UsePipes:路由级别使用 pipe
- @UseInterceptors:路由级别使用 interceptor
- @SetMetadata:在 class 或者 handler 上添加 metadata
- @Get、@Post、@Put、@Delete、@Patch、@Options、@Head:声明 get、post、put、delete、patch、options、head 的请求方式
- @Param:取出 url 中的参数,比如 /aaa/:id 中的 id
- @Query: 取出 query 部分的参数,比如 /aaa?name=xx 中的 name
- @Body:取出请求 body,通过 dto class 来接收
- @Headers:取出某个或全部请求头
- @Session:取出 session 对象,需要启用 express-session 中间件
- @HostParm: 取出 host 里的参数
- @Req、@Request:注入 request 对象
- @Res、@Response:注入 response 对象,一旦注入了这个 Nest 就不会把返回值作为响应了,除非指定 passthrough 为true
- @Next:注入调用下一个 handler 的 next 方法
- @HttpCode: 修改响应的状态码
- @Header:修改响应头
- @Redirect:指定重定向的 url
- @Render:指定渲染用的模版引擎