首页 > 其他分享 >Nestjs系列 Nestjs常用装饰器

Nestjs系列 Nestjs常用装饰器

时间:2024-03-05 20:56:04浏览次数:25  
标签:系列 请求 session Nestjs 模块 声明 装饰 路由 注入

在此之前,项目中使用的各种 @Inject @Controller 等以 @ 开头的都是装饰器,这里对使用中常用的装饰器进行进一步认识。

模块之间常用装饰器

模块装饰器

  • @Module 声明模块

image

@Controller@Injectable 分别声明其中的 controller 和 provider(service)

image

其中 @Injectable 可以在任意一个 class 中声明

  • useFactory useValue 声明 provider

image

  • @Inject 注入指定 token

image

constructor 中的对象实例也可以手动使用 @Inject 注入

image

  • @Optional 可选注入

image

  • @Global 声明为全局 Module

当存在模块会在大部分其它模块中引入时,声明为全局 Module,就可以少一步 imports

image

AOP 装饰器

  • @Catch 是异常过滤器 Exception Filter 中,指定捕获异常类型的注解
  • @UseFilter 是使用异常过滤器的注解

image

  • @UseGuards @UsePipes @UseInterceptors,使用方式和 @UseFilter 一样。

此处的更多内容可阅读上一篇文章:Nestjs系列 Nestjs中的AOP架构

image

  • @SetMetadata

可以使用 @SetMetadata() 装饰器来为路由处理方法设置元数据

image

请求方式常用装饰器

请求 Method

  • @Get @Post @Patch @Put @Delete @Options @Head,这些顾名思义,都是前端可传入的 method 类型

  • @Param UrlParam 参数

当传入动态 urlParam 时,比如 /person/1 /person/2 这种动态 url 参数

image

  • @Body 可以获取请求体中的参数

image

  • @Query 可以接收 query param 请求参数

image

请求信息常用装饰器

  • @Headers 获取请求头的所有信息或者某个信息

image

  • @Ip 拿到请求的 ip

image

  • @Session 拿到 session 对象
  @Get()
  findAll(@Session() session) {
    return { session };
  }

当然,直接取 session 是没有值的,因为 session 是存储在服务端的,而服务端没有执行存储 session 的操作,自然没有数据

安装 express-session 插件

pnpm i express-session
pnpm i @types/express-session -D  # ts类型

image

  • @HostParam 取 host 里的参数

@Controller 可以指定访问的 host 地址,只有当 host 满足 xx.0.0.1 时才可以访问

image

@HostParam 获取 host 对象

image

  • @Req,获取整个 request 对象,上边的几个装饰器,数据都可以从 request 中获取

image

  • @Res 注入的 response 对象较为特殊,如果注入却没有使用 response 进行返回,Nest 也不会自动返回响应内容,必须手动 response.json('my response');

image

这样的作用就是为了防止自己注入使用的 response 和 Nest 本身的响应冲突

  • @Next 注入时,也不会主动返回响应,其作用就是转发给下一个同名路由的 handler

image

  • @HttpCode 默认情况下,所有正常响应的 handler 返回的状态码都是 200,可以使用 @HttpCode 指定返回的状态码

image

  • @Header,可以自定义返回的 header 数据
    • @Header 是自定义添加请求头返回响应,而 @Headers 是读请求中的 header

image

  • @Redirect 路由重定向,即访问某个路由时,重定向到指定地址

image

重定向的地址也可以写在响应中

image

模板引擎渲染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 输出

image

此时访问 /person 路由
image

总结

  • @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:指定渲染用的模版引擎

标签:系列,请求,session,Nestjs,模块,声明,装饰,路由,注入
From: https://www.cnblogs.com/jsonq/p/18052638

相关文章

  • 开源:Taurus.Idempotent 分布式幂等性锁框架,支持 .Net 和 .Net Core 双系列版本
    分布式幂等性锁介绍:分布式幂等性框架的作用是确保在分布式系统中的操作具有幂等性,即无论操作被重复执行多少次,最终的结果都是一致的。幂等性是指对同一操作的多次执行所产生的效果与仅执行一次的效果相同。以下是分布式幂等性框架的主要作用:避免重复操作:在分布式系统中,由于......
  • 1-8高灵敏度电容式水位检测芯片VK36W系列 电容式触摸IC原厂【FAE技术支持】
     产品型号:VK36W1D产品品牌:VINKA/永嘉微电封装形式:SOT23-6产品年份:新年份深圳市永嘉微电科技有限公司,原厂直销,原装现货更有优势!工程服务,技术支持,让您的生产高枕无忧!量大价优,保证原装正品。您有量,我有价!概述VK36W1D具有1个触摸检测通道,可用来检测水从无到有和水从有到无的......
  • 接口自动化测试要做什么?8个步骤讲的明明白白(小白也能看懂系列)
    先了解下接口测试流程:1、需求分析2、Api文档分析与评审3、测试计划编写4、用例设计与评审5、环境搭建(工具)6、执行用例7、缺陷管理8、测试报告那"接口自动化测试"怎么弄?只需要在上篇文章的基础上再梳理下就可以。为更好理解"接口自动化"具体操作流程,最好我们提前了解下,为什么要做......
  • 了解 NVIDIA 的数据中心 GPU 系列
    长话短说NVIDIA拥有数十个GPU,可以为不同大小的ML模型提供服务。但了解这些不同卡的性能和成本(更不用说保持名称正确)是一个挑战。每个GPU的名称是一个字母数字标识符,传达有关其架构和规格的信息。本指南可帮助您浏览NVIDIA数据中心GPU系列并将其映射到您的模型服务需......
  • 重启windows构建服务器引起的一系列问题
    Jenkins构建部分命令找不到一、问题描述:jenkins构建报错ERROR,乱码二、分析原因进服务器手动执行,提示MSbuild.exe命令找不到,原来的环境变量设置的临时的,重启服务器之后,部分环境变量丢失 三、解决方法在Windows系统构建服务器安装工具后需要直接调用,请添加到系统变量中,避免......
  • 多线程系列(十三) -一文带你搞懂阻塞队列
    一、摘要在之前的文章中,我们介绍了生产者和消费者模型的最基本实现思路,相信大家对它已经有一个初步的认识。在Java的并发包里面还有一个非常重要的接口:BlockingQueue。BlockingQueue是一个阻塞队列,更为准确的解释是:BlockingQueue是一个基于阻塞机制实现的线程安全的队列。通......
  • Python工具箱系列(五十)
    使用PIL加工图片 常见的图片操作包括但不限于:•大小进行变化•旋转•翻转•使用滤镜进行处理•剪切   以下python代码演示了如何将一幅美女图进行多种加工处理,并且汇集在一起,形成一个类似于照片墙的相关操作。fromPILimportImagefromPILimportImageFilterf......
  • 数据库系列:大厂使用数据库中间件解决什么问题?
    相关文章数据库系列:MySQL慢查询分析和性能优化数据库系列:MySQL索引优化总结(综合版)数据库系列:高并发下的数据字段变更数据库系列:覆盖索引和规避回表数据库系列:数据库高可用及无损扩容数据库系列:使用高区分度索引列提升性能数据库系列:前缀索引和索引长度的取舍数据库系列:My......
  • MySQL锁系列(二)之 锁解读
    原文链接https://keithlan.github.io/2017/06/05/innodb_locks_show_engine/背景锁系列第一期的时候介绍的锁,我们要如何去解读呢?在哪里能够看到这些锁?锁信息解读工欲善其事必先利其器showengineinnodbstatus关于锁的信息是最详细的案例一(有索引的情况)前期准备......
  • MySQL锁系列(一)之锁的种类和概念
    原文链接https://keithlan.github.io/2017/06/05/innodb_locks_1/背景锁是MySQL里面最难理解的知识,但是又无处不在。一开始接触锁的时候,感觉被各种锁类型和名词弄得晕头转向,就别说其他了。本文是通过DBA的视角(非InnoDB内核开发)来分析和窥探锁的奥秘,并解决实际工作当中遇到的问......