nest小结

一 :nest/cli  常见命令

1 生成中间件。 nest g middle name (生成中间件)

2 生成拦截器。  nest g interceptor name xxx

3 生成守卫。  nest g gu name xxx

二: 如何在项目中如何应用多个中间件?

import { Injectable, NestMiddleware } from '@nestjs/common';@Injectable()
export class Mid1Middleware implements NestMiddleware {use(req: any, res: any, next: () => void) {console.log("middle1-----")next();}
}----------------------------------------
import { Injectable, NestMiddleware } from '@nestjs/common';@Injectable()
export class Mid2Middleware implements NestMiddleware {use(req: any, res: any, next: () => void) {console.log("middle2-----")next();}
}

step2:改写app.module.ts

export class AppModule implements NestModule{configure(consumer: MiddlewareConsumer) {consumer.apply(Mid1Middleware,Mid2Middleware).forRoutes("*")// consumer.apply(Mid2Middleware).forRoutes("*")}}

apply方法中传入多个中间件函数名称即可

三:如何实现http的拦截器?

step1 : nest g interceptor interceptor/reqest    |    nest g interceptor interceptor/response

该命令将生成目录interceptor,且包含reqest和response两个函数

setp2 : 

request
-----------------------------------import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';@Injectable()
export class ReqestInterceptor implements NestInterceptor {intercept(context: ExecutionContext, next: CallHandler): Observable<any> {console.log("before request-----")return next.handle();}
}response
-----------------------------------
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable, map } from 'rxjs';@Injectable()
export class ResponseInterceptor implements NestInterceptor {intercept(context: ExecutionContext, next: CallHandler): Observable<any> {console.log("response request----")return next.handle().pipe(map(data=>({data,status:200,message:'ok'})))}
}//在返回值中我们定义了拦截以后的数据格式

step3 :应用拦截器

import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
import {ResponseInterceptor} from "./interceptor/response/response.interceptor"
@Controller()
export class AppController {constructor(private readonly appService: AppService) {}@Get()getHello(): string {return this.appService.getHello();}@Get('list')@UseInterceptors(ResponseInterceptor)   //这里是关键,UseInterceptors装饰器可以对制定的路由进行拦截getList(){let arr=[{id:1,name:"aaaa"},{id:2,name:"bbbbb"},{id:3,name:"ccccc"},{id:4,name:"dddddd"},]return arr //我们只需要正常返回数据即可,拦截器会自动把最后的数据格式进行转换}
}

提示:这里我们是针对某些具体的请求做了拦截处理,包括返回值格式化,如果要对全局所有接口都作统一的处理,这时候我们需要做如下更改

app.module.ts中

import { APP_INTERCEPTOR } from '@nestjs/core';
import { ResponseInterceptor } from './interceptor/response/response.interceptor';
import { ReqestInterceptor } from './interceptor/reqest/reqest.interceptor';
@Module({imports: [],controllers: [AppController],providers: [AppService,{provide:APP_INTERCEPTOR,useClass:ReqestInterceptor},{provide:APP_INTERCEPTOR,useClass:ResponseInterceptor}],
})
export class AppModule implements NestModule{configure(consumer: MiddlewareConsumer) {consumer.apply(Mid1Middleware,Mid2Middleware).forRoutes("*")// consumer.apply(Mid2Middleware).forRoutes("*")}}

providers选项中我们引入了APP_INTERCEPTOR选项。同时应用RequestInterceptor和ResponseInterceptor,这样就能实现全局的路由拦截

四:nest如何守卫?(以判断请求中是否有token为例)

step1: nest g gu AuthGurd

step2: 

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';@Injectable()
export class AuthgurdGuard implements CanActivate {canActivate(context: ExecutionContext,): boolean | Promise<boolean> | Observable<boolean> {const request =context.switchToHttp().getRequest()const token=request.headers['authorization']if(token && token ==='abc123'){return true}return false;}
}

step3:在controller中对请求作守卫

import { Controller, Get, UseGuards, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
import {ResponseInterceptor} from "./interceptor/response/response.interceptor"
import { AuthgurdGuard } from './authgurd/authgurd.guard';
@Controller()export class AppController {constructor(private readonly appService: AppService) {}@Get()getHello(): string {return this.appService.getHello();}@Get('list')@UseGuards(AuthgurdGuard)// @UseInterceptors(ResponseInterceptor)getList(){let arr=[{id:1,name:"aaaa"},{id:2,name:"bbbbb"},{id:3,name:"ccccc"},{id:4,name:"dddddd"},]return arr}
}

以上我们以list接口为例,请求http://localhost:3000/list如果header中没有token则会报错,而其他接口则不受影响。

同样,如果想让AuthGuard全局生效。则可以在app.module.ts中采用如下方式:

import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
import { AuthgurdGuard } from './authgurd/authgurd.guard';@Module({imports: [],controllers: [AppController],providers: [AppService,{provide:APP_GUARD, //这里是核心useClass: AuthGuard,},],
})

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

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

相关文章

Python学习笔记——认识Python软件包

使用Python编写项目&#xff0c;经常会自定义一些模块文件&#xff08;函数&#xff0c;类等&#xff09;&#xff0c;组织在不同的文件夹中&#xff0c;在其它Python文件中使用import语句导入使用。Python软件包和普通的文件夹不同之处在于有一个特定文件“__init__.py”。当导…

vue中的this.$emit方法:用于子组件中触发父组件方法并传值

vue中的this.$emit方法 使用一&#xff1a;$emit使用二&#xff1a;$emit update 和 .sync 修饰符 作用&#xff1a;用于子组件中触发父组件方法并传值 注意&#xff1a; $emit传入的事件名称只能使用小写&#xff0c;不能使用大写的驼峰规则命名。 使用一&#xff1a;$emit …

【正点原子STM32连载】 第五十五章 FreeRTOS移植实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第五…

用Python制定旅行计划

编写一个Python脚本,用于制定旅行计划。这个脚本将询问关于旅行的基本问题,并根据回答生成一旅行计划。以下是示例脚本: def create_travel_plan(): # 询问用户目的地 destination = input("请输入您的目的地:") # 询问旅行日期 start_date = input("请…

【Kuiperinfer】笔记02 GoogleTest入门

文章目录 Google Test基本概念 编写测试头文件AssertionTESTTest FixtureInvoking the Tests编写main()函数 参考 Google Test Google Test是用于编写C测试的框架&#xff0c;支持多种类型的测试&#xff0c;而不是只有单元测试&#xff08;unit test&#xff09;。 编写测试…

weblogic8版本修改控制台密码

weblogic的8.1老版本在控制台界面上没有修改密码的按钮选项&#xff0c;因此需要通过修改服务器配置文件来更新密码。 步骤1&#xff1a; 备份域目录下的DefaultAuthenticatorInit.ldift文件 通过find /域目录 -name weblogic.jar 查到jar包&#xff0c;通过命令生成文件 …

css3的var()函数

css3的var()函数 变量要以两个连字符--(横杆)(减号)为开头 变量可以在:root{}中定义, :root可以在css中创建全局样式变量。通过 :root本身写的样式&#xff0c;相当于 html&#xff0c;但优先级比后者高。 在CSS3中&#xff0c;var()函数是一个用于插入CSS自定义属性&#xff…

Vulhub 靶场训练 DC-6解析

一、搭建环境 kali充当攻击机 ip地址是&#xff1a;192.168.200.14 DC-6充当靶机 &#xff1a; IP地址暂时未知 注意&#xff1a;让两台机器的使用同一种网络适配器 二、信息收集 1、探索同网段存活的主机 ①第一种方法 arp-scan -l②第二种方法 netdiscover -i eth0 -…

Python内置函数67个语法、参数和用法详解

要获取Python解释器中所有当前可用的内置函数和变量的完整列表,您可以在Python解释器中使用dir(__builtins__)命令。这将返回一个包含所有内置函数、异常和其他内置对象的列表。 分为10类 数学运算(7): abs 绝对值divmod 商和余数max 最大min最小pow 指数幂round 取整sum 求…

npm/nodejs安装、切换源

前言 发现自己电脑上没有npm也没有node很震惊&#xff0c;难道我没写过代码么&#xff1f;不扯了&#xff0c;进入正题哈哈…… 安装 一般没有npm的话会报错&#xff1a; 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称而且报这个错&#xff0c;我们执行…

【骑行新纪元】社交风暴来袭,你准备加入骑友圈了吗?

当你的自行车轮轻轻滑过清晨的露水&#xff0c;你是否曾想与志同道合的骑友分享这一刻的喜悦&#xff1f;骑行&#xff0c;这个曾经只是简单运动的代名词&#xff0c;如今正在悄然转变。随着科技的进步和社交平台的发展&#xff0c;骑行不再只是一种健身方式&#xff0c;它还带…

【机器学习】是什么?——讲解

机器学习 机器学习是人工智能&#xff08;AI&#xff09;的一个子领域&#xff0c;它提供了系统通过数据学习并改进其性能的能力&#xff0c;而不需要人为进行显式编程&#xff0c;机器学习模型利用大量的数据样本&#xff08;训练数据&#xff09;来学习如何识别模式和关系&a…

C-指针-010

1指针 1.1语法&#xff1a; 【基类型*指针变量名】 【int *p&a】1.2语义&#xff1a; 【基类型】&#xff1a;指针变量指向的目标的数据类型 【*】&#xff1a;表示此时定义的变量是一个指针类型的变量 【&a】&#xff1a;一块存放着int类型数据的空间的地址 【*p】…

slot全局属性 <slot>标签</slot> ::slotted()伪元素 笔记240223

slot全局属性 标签 ::slotted()伪元素 MDN HTML全局属性 MDN HTML全局属性 slot MDN HTML <slot>标签元素 MDN CSS ::slotted()为元素 MDN 使用 templates and slots <slot>标签 <slot>标签是的 display 是 contents 在Web开发中&#xff0c;<s…

【高德地图】Android搭建3D高德地图详细教

&#x1f4d6;Android搭建3D高德地图详细教程 &#x1f4d6;第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 &#x1f4d6;第2章 搭建3D地图并显示✅第 1 步&#xff1a;创建 Android 项目✅第 2 步&#xff1a;获取高德Key✅第 3 步&#xff1a;下载地图SDK✅第 4 步&…

照片上多余的人怎么处理?这几种方法让你的照片更完美!

照片怎么去掉多余人像&#xff1f;这是许多摄影爱好者经常遇到的问题。有时候&#xff0c;我们拍摄了一张非常美好的照片&#xff0c;但由于某些原因&#xff0c;照片中出现了不希望出现的人物。这时候&#xff0c;我们该如何处理呢&#xff1f;下面&#xff0c;我将分享几种常…

2.5网安学习第二阶段第五周回顾(个人学习记录使用)

本周重点 ①多进程和多线程 1、进程和线程 2、多线程爆破 ②Redis数据库 1、Redis的使用 2、Redis持久化 3、Redis未授权免密登录 ③嗅探和Python攻击脚本 1、嗅探&#xff08;端口扫描和IP扫描&#xff09; 2、SCAPY的应用 3、Python攻击脚本&#xff08;SYN半连接…

【More Effective C++】条款22:采用op+=取代op+优势

采用operator实现operator优点&#xff1a; 降低维护成本&#xff0c;只需要维护operator即可&#xff1b;如果operator为publicoperator不需要称为class的友元&#xff1b;通过模板的方式自动实现operator版本&#xff1b;提供两种操作方式&#xff0c;operator效率高&#x…

计算机网络-局域网

文章目录 局域网局域网拓扑结构以太网以太网传输介质以太网时隙提高传统以太网带宽的途径以太网帧格式 局域网协议IEEE 802参考模型IEEE802.2协议LLC帧格式及其控制字段LLC提供的三种服务 IEEE 802.3协议IEEE 802.4协议IEEE 802.5协议 高速局域网100M以太网千兆以太网万兆以太网…

冲突管理最佳实践

任何团队都无法避免冲突&#xff0c;如何有效管理冲突&#xff0c;将冲突转化为团队成长和凝聚的动力&#xff0c;是任何一个团队管理者的必修课。原文: Best Practices for Managing Conflict in Engineering Management Obie Fernandez Unsplash 冲突在任何组织中都不可避免&…