nestJs 高阶用法

news2024/11/28 0:53:23

真正的服务器需要做全局的数据核查、敏感操作落库和数据转化。

拥有这些能力才能让后台能力更加丰富,本篇将主要使用 NestJs 的高级能力,来实现这些功能。

  • 使用 guards 和 decorators 实现数据校验核查
  • 通过 interceptors 和 decorators 实现敏感操作录入
  • 自定义 pipes 实现数据转化

 守卫 Guards

 

请求到达业务逻辑前 会经过 guard,这样在接口前可以做统一处理。

例如:检查登陆态、检查权限 ...

需要在业务逻辑前 统一检查 的信息,都可以抽象成守卫。

在真实场景中,大多数的后台管理端会用 JWT 实现接口鉴权。NestJs 也提供了对应的解决方案。

由于较长且原理相通,本篇暂时用校验 user 字段做演示。

新建守卫

 新建 user.guard.ts 文件

// src/common/guards/user.guard.ts
import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class UserGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    const user = request.body.user;

    if (user) {
        return true;
    }

    throw new UnauthorizedException('need user field');
  }
}

 单个接口使用守卫

单个接口使用需要用 @UseGuards 作为引用。再将定义的 UserGuard 作为入参。

在 student.controller.ts 中使用

全局使用

 全局使用仅需在 app.module.ts 的 providers 中引入。这样就对全局生效了

自定义装饰器过滤

总有些接口我们不需要有 user 字段,这时自定义 decorator 就出马了。

基本原理是:在接口前设置 MetaData, 在服务启动时把 MetaData 写入内存,这样在请求过来时判断有无 MetaData 标签。有则通过,无则校验。

顺便也将 get 请求类型过滤掉。

NoUser 使用

 再调用时,就不会再校验了。

这样就实现了全局守卫,但是部分接口不需要守卫的情况。

特别适用于登录态的校验,只有登陆接口不需要登录态,其他接口都需要登陆态或鉴权。

拦截器 Interceptors

拦截器工作在 请求前响应后。它的原理和 decorator 类似,不同的是能做全局级别。

它的应用场景也非常广,例如:接口请求参数和请求结果的数据保存、设计模式中的 adapter 模式 等...

我们来用它实现敏感信息的数据保存。

它的原理和 guards 类似, 通过 decorator 加载到内存,知道哪些接口需要敏感操作记录,然后在调用接口时将 入参和结果存入。

涉及到数据库操作,因此需要新增模块和数据库连接。

新建敏感权限模块

新建敏感权限模块,包括 controller、module 和 service

nest g controller sensitive
nest g module sensitive
nest g service sensitive

创建 entity 文件

新建 sensitive.entity.ts 。

这里会用到 transformer, 原因是 mysql 底层并没有 Object 类型。需要通过 JS 把它存成 string 格式,在读取时用 object 格式。这样代码就不需要感知是啥类型了。

引用数据库

和之前介绍数据库一样,在 sensitive.module.ts 中引入数据库 

 service 核心逻辑

敏感操作比较简单,service 仅需实现新增和查询。

先定义敏感操作类型

// src/sensitive/constants.ts
export enum SensitiveType {
    Modify = 'Modify',
    Set = 'Set',
    Create = 'Create',
    Delete = 'Delete',
}

在修改 service,引入db操作

 

controller 修改

controller 比较简单,只需要简单的查询即可。敏感信息写入则是通过 decorator + interceptor 来实现

新增装饰器

装饰器的用场来了,只需要告诉某个接口需要敏感操作记录,并指定类型即可。 

通过传参的方式,定义敏感操作的类型。在数据库中可以分类,通过索引的方式查找修改入参和结果。 

拦截器 

重点来了!!

和守卫权限校验类似,通过 reflector 取出内存中的 sensitive-operation 类型。

新建 src/common/interceptors/sensitive.interceptor.ts

 并在 app.module.ts 中引入全局。

其他模块引用

 student 模块引入

 仅需要在接口前引入 @SensitiveOperation(SensitiveType.Set) 即可!是不是非常优美。

 在不影响原有业务逻辑的情况下,仅是在接口处做标识的简单调用。实现了 AOP 的调用方式。对老代码的改造和新业务的编写都十分有用。

管道 Pipes

NestJs Pipes 的概念和 linux shell 的概念非常相似,都是通过前者的输出再做一些事情。

它的应用场景也非常广,例如:数据转化,数据校验等...

对数据输入时的操作非常有用。对复杂数据校验,例如表单数据等十分有用。

我们没有复杂输入,我们来使用简单的数据转化,实现在名字前加上🇨🇳

新建 Pipes

 新建 src/common/pipes/name.pipes.ts

// src/common/pipes/name.pipes.ts
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

@Injectable()
export class TransformNamePipe implements PipeTransform {
  transform(name: string, metadata: ArgumentMetadata) {
    return `🇨🇳 ${name.trim()}`;
  }
}

 和其他 NestJs 一样,都需要重载一边内置对象。Pipes 也需要重载 PipeTransform

使用管道 

在 controller 中使用 pipes。 

 query 的第二个参数是 pipes, 也可以使用多个 pipes 对数据连续处理

调用接口 

简单回顾下教程内容:

  • 通过 nest cli 新建工程、新建模块
  • 通过 @Get@Post 实现 get、post 请求
  • 通过 dto 限制对参数进行限制
  • 自定义 decorator 实现参数获取、设置 metadata
  • 调用内置 log 实现日志规范化
  • 使用 typeorm 对数据库连接和基础操作,并进行联表操作及查询
  • 使用 guard 对参数进行校验(可扩展成登录态)
  • 使用 interceptor 实现敏感数据落地
  • 使用 pipes 实现数据格式化

笔者也在 NestJs 逐渐探索中。它不仅包括简单的数据服务,还支持 GraphQLSSEMicroservice 等等,是综合性非常强的框架。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux三剑客:grep的基本使用

目录 grep介绍 什么是grep和egrep 使用grep 命令格式 命令功能 命令参数 grep配合正则表达式使用 认识正则 基本正则表达式 匹配字符 配置次数 位置锚定&#xff1a;定位出现的位置 分组和后向引用 作为学习一名计算机专业的学生&#xff0c;我想Linux应该需要了解…

详细自动化测试介绍

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【10套模拟】【5】

关键字&#xff1a; 数据的最小单位、归并排序&#xff08;两两归并&#xff09;、单链表顺序存取、邻接表表头顶点顺序存储随机访问、三角矩阵元素个数、堆的性质、冒泡排序、二叉树是否相同

我对需求分析的理解

一、背景 最近做了一个项目&#xff0c;也算是踩坑过程&#xff0c;产品上线了&#xff0c;用户不怎么买单&#xff0c;使用者聊聊无几&#xff0c;前期一直不清楚为什么会这样&#xff0c;诚然新系统的开发设计上采用了更新的技术&#xff0c;设计上采用了更好的理念&#xf…

知识梳理到了领域榜一,意外,开心。

我的护城河 就是掌握的不断更新的技术。 一直被认可的能力。 完美的项目交付。 写的文章得到了读者们的认可。 希望我做的努力被更多的人看到。 分享的代码片可以解决他人的问题。 很惊喜&#xff0c;今早我的文章被数据结构和算法领域内容榜排到了第一名。 被认可的感觉很棒。…

Python-pptx教程之二操作已有PPT模板文件

文章目录 简单的案例找到要修改的元素修改幻灯片中的文本代码使用示例 修改幻灯片的图片代码使用示例 删除幻灯片代码使用示例 获取PPT中所有的文本内容获取PPT中所有的图片总结 在上一篇中我们已经学会了如何从零开始生成PPT文件&#xff0c;从零开始生成较为复杂的PPT是非常消…

【重点文章】服务升级惨痛教训

文章目录 事故解析:避免方法涉及知识 以前怎么接触过大表&#xff0c;所以alter操作我都是一次性执行好几条的&#xff0c;这几条一下子干过去了   结果就是一直在转圈执行&#xff0c;因为alter产生的是表级排它锁&#xff0c;所以有关这几个表的查询更新操作全部处于阻塞…

04-学成在线之系统管理服务模块之查询数据字典表中的内容,前后端联调测试

前后端联调 配置前端环境 实际开发中先由后端工程师将接口设计好并编写接口文档并交给前端工程师&#xff0c;前后端的工程师就开始并行开发 前端开发人员先自己mock数据即使用假数据进行开发,当后端代码完成后前端工程师尝试请求后端接口获取数据然后渲染到页面 第一步: 首…

大力说企微第一课:企业微信的注册验证和认证

这段时间有好几个朋友问我&#xff0c;怎么用企业微信&#xff0c;还有一些朋友反馈&#xff0c;企业微信使用起来不太方便。 在我的印象中&#xff0c;企业微信确实不如微信那么简单&#xff0c;毕竟用户对象是企业&#xff0c;是企业就有多个部门&#xff0c;就有流程&#x…

ubuntu20源码编译搭建SRS流媒体服务器

第一、下载源码 下载源码&#xff0c;推荐用Ubuntu20&#xff1a; git clone -b develop https://gitee.com/ossrs/srs.git第二、编译 2.1、切换到srs/trunk目录&#xff1a; cd srs/trunk2.2、执行configure脚本 ./configure2.3、执行make命令 make2.4、修改conf/rtmp.c…

零代码实现问卷网与巨量引擎的对接

通过数环通&#xff0c;您可以使用不到几分钟的时间即可实现问卷网与巨量引擎的对接与集成&#xff0c;从而高效实现工作流程自动化&#xff0c;降本增效&#xff01; 1.产品介绍 巨量引擎是字节跳动旗下的营销服务品牌&#xff0c;它整合了字节跳动旗下的产品及海量内容&…

简单高效的定制移动固态硬盘,稳定易用的办公小助手

我在平时的工作中&#xff0c;常常需要处理各种大文件和数据&#xff0c;如果硬盘速度跟不上&#xff0c;那工作效率就会大幅降低。今年固态硬盘的价格大幅下降&#xff0c;有很多国产品牌加入其中&#xff0c;很容易找到一款性价比高的固态硬盘&#xff0c;搭配硬盘盒使用&…

mac清除所有数据,不抹除的情况下如何实现?

mac清除所有数据是一个比较复杂的任务&#xff0c;尤其是在不进行系统抹除的情况下。但是&#xff0c;如果你想要将mac完全恢复到出厂设置的状态&#xff0c;同时保留数据&#xff0c;本文将介绍一些可行的方法&#xff0c;帮助您在不抹除硬盘数据的情况下&#xff0c;让mac清除…

Ganache结合内网穿透实现远程不同局域网公网访问

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站…

Zookeeper Java 开发,自定义分布式锁示例

文章目录 一、概述二、导入依赖包三、创建锁的过程3.1 通过 create 创建节点信息3.2 AsyncCallback.StringCallback 回调函数3.3 AsyncCallback.Children2Callback 的回调函数3.4 Watcher 的回调函数 四、完整示例4.1 完整分布式锁代码4.2 测试类 如果您还没有安装Zookeeper请看…

Shopee选品工具软件——知虾,助您轻松把握市场趋势

在如今竞争激烈的电商市场中&#xff0c;了解市场趋势和数据分析是成功的关键。对于Shopee虾皮平台上的商家来说&#xff0c;知虾是一款强大的选品工具软件&#xff0c;它提供了全面的数据分析服务&#xff0c;帮助商家快速了解大盘走势&#xff0c;并挖掘潜力行业类目。本文将…

[msg_msg] corCTF2021 -- fire_of_salvation

前言 msg_msg 是 kernel pwn 中经常用作堆喷的结构体. 其包含一个 0x30 大小的 header. 但 msg_msg 的威力远不如此, 利用 msg_msg 配合其他堆漏洞可以实现任意地址读写的功能. 程序分析 本题给了源码, 可以直接对着源码看. 并且题目给了编译配置文件, 所以可以直接编译一个…

C 语言指针和数组

C 语言指针和数组 在本教程中&#xff0c;您将了解C语言编程中数组与指针之间的关系。您还将学习使用指针访问数组元素。 在了解数组与指针之间的关系之前&#xff0c;请确保检查以下两个主体&#xff1a; [C 数组](C 语言数组-CSDN博客)[C 指针](C 语言指针-CSDN博客) 数组…

2023上海国际电力电工展盛大举行 规模创新高 与行业「升级、转型、融合」

由中国电力企业联合会、国家电网主办及雅式展览服务有限公司承办的「第三十一届上海国际电力设备及技术展览会 (EP Shanghai 2023)」从11月15日起至17日一连三天于上海新国际博览中心盛大举行&#xff0c;并首度增设专题子展「上海国际储能技术应用展览会」。本届展会以“升级、…

2023_“数维杯”问题B:棉秸秆热解的催化反应-详细解析含代码

题目翻译&#xff1a; 随着全球对可再生能源需求的不断增加&#xff0c;生物质能作为一种成熟的可再生能源得到了广泛的关注。棉花秸秆作为一种农业废弃物&#xff0c;因其丰富的纤维素、木质素等生物质成分而被视为重要的生物质资源。虽然棉花秸秆的热解可以产生各种形式的可…