Nest.js权限管理系统开发(六)新建模块

本文相关文档:NestJS 中文网

创建模块

nest g命令

我们知道一个模块往往包含controller、module、service等文件,为了方便我们创建这些文件,nest cli提供了一些命令:

生成模块 (nest g mo) 以保持代码井井有条并建立清晰的边界(对相关组件进行分组)
生成控制器 (nest g co) 来定义 CRUD 路由(或 GraphQL 应用的查询/变更)
生成服务 (nest g s) 以实现和隔离业务逻辑
生成一个实体类/接口来表示资源数据形状
生成数据传输对象(或 GraphQL 应用的输入)以定义数据将如何通过网络发送

你可以执行nest -h 查看这些命令。

为了生成上述的全部文件,nest还提供了一个命令:

nest g resource

nest g resource 命令不仅生成所有 NestJS 构建块(模块、服务、控制器类),还生成实体类、DTO 类以及测试 (.spec) 文件。

取消生成spec文件

为了避免生成测试文件,你可以传递 --no-spec 标志,如下所示:nest g resource user --no-spec。或者nest-cli.json中配置:

  "generateOptions": {"spec": false}

我们在项目根目录下执行nest g res user命令:

我们可以看到生成的资源文件里没有出现spec文件。值得注意的一点是,我们可以在任何路径下执行nest g命令,并在对应位置生成相关文件。但是如果你想让nest-cli.json生效的话,只能在项目根目录执行命令,会在相对于src的路径下生成相应的资源。因为nest cli只会在当前路径下寻找配置文件,可以查看相关实现。 此外,我们还会发现刚才生成的UserModule已经被自动注册到了AppModule中。

样板代码

nest cli已经为我们的user模块创建了样板代码。

样板类和注解

在UserController中,通过构造方法注入了一个USerService的对象。整个UserController使用@Controller('user')进行注解,这个语法叫做装饰器。这个注解表示的是路由路径前缀,UserController中的每个方法对应一个具体的路由,如果这些路由有相同的前缀,我们就可以将这个前缀上升到类本身,这样每个路由只要标注不同的后缀部分即可。

样板方法

方法注解

每个方法都有例如@Post(),@Get(':id')之类的注解,Post、Get本身表示该路由支持的请求方法。括号里是路由,路由可以是静态的路径,也可以带动态的参数。@Get(':id')就表示/user/1之类的路由。此外路由还支持模式匹配,'ab*cd' 路由路径将匹配 abcdab_cdabecd 等。字符 ?+*() 可以在路由路径中使用,并且是它们对应的正则表达式的子集。连字符 (-) 和点 (.) 由基于字符串的路径逐字解释。仅 express 支持路由中间的通配符。

我们发现每个方法最终都是返回了一个值,其实框架已经替我们处理响应的状态码,对于get请求是200,post则是201。如果想自定义返回的状态码,可以使用以下注解:

@HttpCode(204)

同理,如果想自定义响应的header,也可以:

@Header('Cache-Control', 'none')

甚至指定重定向路径:

@Redirect('https://nest.nodejs.cn', 301)

样板代码中的方法都是同步的,我们也可以实现异步的,也就是返回类型为Promise<T>。

参数注解

方法参数中也存在着注解,例如findOne(@Param('id') id: string)表示id是路由中的参数值,同理@Query("id")就表示id是路由中的查询参数值。对于get请求,我们使用这两个注解就能获得我们关心的数据。对于post请求,我们关心的数据在请求实体里,需要使用@Body()注解来获取。

载荷转换

用户提交的数据是一个纯 JavaScript 对象,但在我们的DTO架构中,我们希望处理的是具体的类对应的对象。这里我们不能使用接口类型,因为TypeScript 接口在转换过程中被删除。update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto)表明框架已经将提交的数据转为了UpdateUserDto对象。要启用这个转换,需要使用ValidationPipe。在main.js中添加代码:

// 全局验证app.useGlobalPipes(new ValidationPipe({transform: true,enableDebugMessages: true, // 开发环境disableErrorMessages: false,forbidUnknownValues: false,}),)

我们把用于转换或验证输入数据的provider称为管道pipe。provider的作用域可以是指定模板或者全局,这里使用useGlobalPipes设置全局管道。transform:true表示自动将有效负载转换为根据其 DTO 类类型化的对象。当然这种转换也适用于param和query。

数据验证

使用pipe进行数据验证,有如下几种方式:

1.基于schema的验证:


@Post()
async create(@Body() createCatDto: CreateCatDto) {this.catsService.create(createCatDto);
}export class CreateCatDto {name: string;age: number;breed: string;
}

2.基于zod库的Object schema验证

3.类验证器

需要安装class-validator和class-transformer:

npm i --save class-validator class-transformer

一旦安装了这些,我们就可以向 CreateCatDto 类添加一些装饰器。在这里,我们看到了这种技术的一个显着优势:CreateCatDto 类仍然是我们的 Post 主体对象的唯一真实来源(而不是必须创建一个单独的验证类)。


import { IsString, IsInt } from 'class-validator';export class CreateCatDto {@IsString()name: string;@IsInt()age: number;@IsString()breed: string;
}

然后我们可以创建一个自定义的pipe,在实现中利用这些注解,对数据进行验证。当然内置的 ValidationPipe已经为我们实现了这一切,方便我们开箱即用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/491805.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…

高效!中科院2区SCI,不到两个月录用!审稿人很给力!

【SciencePub学术】 JOURNAL OF ENVIRONMENTAL SCIENCES IF(2022)&#xff1a;6.9&#xff0c;JCR1区&#xff0c;中科院2区 数 期刊数据指标 ISSN&#xff1a;1001-0742 IF(2022)&#xff1a;6.9 自引率&#xff1a;4.30% 年发文量&#xff1a;300篇左右 国人占比&…

openeuler欧拉系统 在windows10上安装报错0xc03a001a

openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、人工智能等应用场景。…

【Prometheus】概念和工作原理介绍

目录 一、概述 1.1 prometheus简介 1.2 prometheus特点 1.3 prometheus架构图 1.4 prometheus组件介绍 1、Prometheus Server 2、Client Library 3、pushgateway 4、Exporters 5、Service Discovery 6、Alertmanager 7、grafana 1.5 Prometheus 数据流向 1.6 Pro…

【电子通识】为什么单片机芯片上会有多组VDD电源?

在单片机芯片规格书中&#xff0c;我们经常能看到多个组VDD的设计&#xff0c;如下红框所示管脚都是VDD管脚。 为什么需要这样设计&#xff1f;只设置一个VDD管脚&#xff0c;把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗&#xff1f;接下来我们从单片机内部的电路结…

K8S—集群调度

目录 前言 一 List-Watch 1.1 list-watch概述 1.2 list-watch工作机制 二 集群调度 2.1 调度过程 2.2 Predicate 和 Priorities 的常见算法和优先级选项 2.3 调度方式 三 亲和性 3.1 节点亲和性 3.2 Pod 亲和性 3.3 键值运算关系 3.4 Pod亲和性与反亲和性 3.5 示例…

(202402)多智能体MetaGPT入门1:MetaGPT环境配置

文章目录 前言拉取MetaGPT仓库1 仅仅安装最新版2 拉取源码本地安装MetaGPT安装成果全流程展示 尝试简单使用1 本地部署大模型尝试&#xff08;失败-->成功&#xff09;2 讯飞星火API调用 前言 感谢datawhale组织开源的多智能体学习内容&#xff0c;飞书文档地址在https://d…

Spring Boot 接口请求日志(基于AOP和自定义注解)

一、需求 在Spring Boot应用中&#xff0c;实现接口请求日志记录功能&#xff0c;要求能够记录包括请求方法、接口路径及请求参数等核心信息&#xff0c;并提供灵活的开关配置。 二、方案概述 采用AOP&#xff08;面向切面编程&#xff09;结合自定义注解的方式实现。 具体…

springboot自定义注解实战

基础知识概述 aop 面向切面编程 1、切面&#xff08;aspect&#xff09;散落在系统各处的通用的业务逻辑代码&#xff0c;如日志模块&#xff0c;权限模块&#xff0c;事务模块等&#xff0c;切面用来装载pointcut和advice2、通知&#xff08;advice&#xff09;所谓通知指的…

AI时代 编程高手的秘密武器:世界顶级大学推荐的计算机教材

文章目录 01 《深入理解计算机系统》02 《算法导论》03 《计算机程序的构造和解释》04 《数据库系统概念》05 《计算机组成与设计&#xff1a;硬件/软件接口》06 《离散数学及其应用》07 《组合数学》08《斯坦福算法博弈论二十讲》 清华、北大、MIT、CMU、斯坦福的学霸们在新学…

【Leetcode】235. 二叉搜索树的最近公共祖先

文章目录 题目思路代码结果 题目 题目链接 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度…

深度学习手写字符识别:推理过程

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客&#xff0c;网上也有很多教程&#xff0c;很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…