首页 > 其他分享 >NestJS 拦截器 和 RxJs

NestJS 拦截器 和 RxJs

时间:2023-04-04 15:58:12浏览次数:59  
标签:map 拦截器 Observable rxjs next NestJS RxJs import

为什么要介绍RxJs 因为 在 Nestjs 已经内置了 RxJs 无需安装 并且Nestjs 也会有一些基于Rxjs提供的API

image-20230404093722875

RxJs是什么

RxJs 使用的是观察者模式,用来编写异步队列和事件处理。

Observable 可观察的物件

Subscription 监听Observable

Operators 纯函数可以处理管道的数据 如 map filter concat reduce 等

文档

https://cn.rx.js.org/

案例

发布订阅

类似于迭代器 next 发出通知 complete通知完成

subscribe 订阅 observable 发出的通知 也就是一个观察者

import { Observable } from "rxjs";
 
//类似于迭代器 next 发出通知  complete通知完成
// 可观察的物件
const observable = new Observable(subscriber=>{
    // 发出通知
    subscriber.next(1)
    subscriber.next(2)
    subscriber.next(3)
 
    setTimeout(()=>{
        subscriber.next(4)
        subscriber.complete()
    },1000)
})

// 订阅通知
observable.subscribe({
    // 每一步都可以检测到
    next:(value)=>{
       console.log(value)
    }
})

image-20230404100417748

定时监听

interval 五百毫秒执行一次 pipe 就是管道的意思

管道里面也是可以去掉接口的支持处理异步数据

去处理数据 这儿展示 了 map 和 filter 跟数组的方法是一样的

最后 通过观察者 subscribe 接受回调

import { interval } from "rxjs";
import { map, filter } from 'rxjs/operators'

// interval 五百毫秒执行一次 pipe 就是管道的意思 
// 管道里面也是可以去掉接口的支持处理异步数据 
const subs = interval(500).pipe(
    map(v => ({ num: v })),
    filter(v => (v.num % 2 == 0))
//通过观察者 subscribe 接受回调
).subscribe((e) => {
    console.log(e)
    // 结束条件
    if (e.num == 10) {
        subs.unsubscribe()
    }
}
)

image-20230404102025427

处理事件

Rxjs 也可以处理事件

不过我们在Nestjs 里面就不用操作DOM 了

你如果Angular 或则 Vue 框架看可以使用 fromEvent

import { fromEvent } from "rxjs";
import { map } from 'rxjs/operators'
 
const dom = fromEvent(document,'click').pipe(map(e=>e.target))
dom.subscribe((e)=>{
 
})

拦截器

拦截器具有一系列有用的功能,这些功能受面向切面编程(AOP)技术的启发。它们可以:

  • 在函数执行之前/之后绑定额外的逻辑
  • 转换从函数返回的结果
  • 转换从函数抛出的异常
  • 扩展基本函数行为
  • 根据所选条件完全重写函数 (例如, 缓存目的)

文档:

https://docs.nestjs.cn/9/interceptors

案例:全局响应格式转换

我们现在没有给我们的Nestjs 规范返回给前端的格式现在比较乱

就是跟下面一样

Hello World!

我们想给他返回一个标准的json 格式

就要给我们的数据做一个全局format

{
  data, //数据
  status:0,
  message:"成功",
  success:true
}

那要怎么实现呢

创建模块

新建common 文件夹

创建 response.ts

image-20230404103903226

Nest Js 配合 Rxjs 格式化数据

response.ts 中写入

import { Injectable, NestInterceptor, CallHandler } from '@nestjs/common'
import { map } from 'rxjs/operators'
import { Observable } from 'rxjs'

// 数据
interface data<T> {
  data: T
}

@Injectable()
export class Response<T = any> implements NestInterceptor {
  intercept(context, next: CallHandler): Observable<data<T>> {
    return next.handle().pipe(map(data => {
      return {
        data,
        status: 0,
        success: true,
        message: "makalo 永远18,永不秃头"
      }
    }))
  }
}

image-20230404104624742

main.ts 中注册

// 注册全局响应拦截-格式转换
app.useGlobalInterceptors(new Response())

image-20230404104858073

访问测试

image-20230404105132644

标签:map,拦截器,Observable,rxjs,next,NestJS,RxJs,import
From: https://www.cnblogs.com/makalochen/p/17286678.html

相关文章

  • RxJS 系列 – Mathematical and Aggregate Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperatorsUtilityOperatorsConditionalandBooleanOperators这篇继续介绍 MathematicalandAggregateOperators 参......
  • RxJS 系列 – Conditional and Boolean Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperatorsUtilityOperators这篇继续介绍 ConditionalandBooleanOperators 参考Docs– ConditionalandBooleanOp......
  • RxJS 系列 – Utility Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperators这篇继续介绍 UtilityOperators 参考Docs–UtilityOperators  Tap ......
  • rxjs
     安装1. web:  https://unpkg.com/[email protected]/dist/cjs/index.js2.npm: npminstallrxjs  因为rxjs本身就是ts写的,所以没有@types/rxjs 这个类型文件。github仓库: https://github.com/ReactiveX/rxjs码云: https://gitee.com/mirrors/rxjs?_from=gitee_search......
  • 拦截器
    1、拦截器的基本概念拦截器是SpringBoot的一个强大的控件,它可以使得程序在进入控制器之前做一些操作,或在控制器方法完成后、甚至是在视图渲染时进行操作,常用于对控制器方法进行预处理和后处理,如进行登录、权限验证问题的处理。拦截器和过滤器的概念相似。过滤器是Ser......
  • 拦截器
    拦截器拦截器是一种动态拦截方法调用的机制作用在指定的方法调用前后预先执行设定后的代码阻止原始方法的执行拦截器与过滤器的区别归属不同:Filter属于servlet技术,Interceptor属于SpringMVC技术拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访......
  • nestJs 模块
    文档:https://docs.nestjs.cn/9/modules模块@Module每个Nest应用程序至少有一个模块,即根模块。根模块是Nest开始安排应用程序树的地方。事实上,根模块可能是应用程序中唯一的模块,特别是当应用程序很小时,但是对于大型程序来说这是没有意义的。在大多数情况下,您将拥有多个......
  • NestJs 提供者
    文档:https://docs.nestjs.cn/9/providersProviders是Nest的一个基本概念。许多基本的Nest类可能被视为provider-service,repository,factory,helper等等。他们都可以通过constructor注入依赖关系。这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能......
  • uni.request拦截器
    uni.requset1uni.request({2url:'',//地址3data:{},//请求body4header:{},//请求header5method:'',//请求方式'GET'/'POST'/'PUT'/'DELETE'6success:(res)=>{},//请求成功回调7fail:......
  • nestJs 控制器
    参考:https://docs.nestjs.cn/9/controllers控制器负责处理传入的请求和向客户端返回响应。控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。为了创建一个基本的控制器,我们使用类和装饰器。......