专栏首页计算机编程nestJS 高速缓存用法

nestJS 高速缓存用法

前言:官方文档在这方面还是没有讲清楚什么使用,怎么应用,只是给了个大概的配置和大致的使用方式,限制在单数据流缓存get请求的数据上面,并没有实质意义上用到缓存的处理。于是博主花了接近一个星期翻看源码以及逐步测试,发现实际上使用真的很简单,这里确实要夸一下nestjs的封装。接下来博主就以验证码缓存来着重介绍其用法。

1、源码分析:

通过官方文档,我们知道要写个拦截器继承CacheInterceptor进行对服务的交互处理,于是让我们查看一下它做了什么操作:

let CacheInterceptor = class CacheInterceptor {
    constructor(cacheManager, reflector) {
        this.cacheManager = cacheManager;
        this.reflector = reflector;
    }
    async intercept(context, call$) {
        const key = this.trackBy(context);
        if (!key) {
            return call$;
        }
        try {
            const value = await this.cacheManager.get(key);
            if (value) {
                return rxjs_1.of(value);
            }
            return call$.pipe(operators_1.tap(response => this.cacheManager.set(key, response)));
        }
        catch (_a) {
            return call$;
        }
    }
    trackBy(context) {
        const httpServer = this.applicationRefHost.applicationRef;
        const isHttpApp = httpServer && !!httpServer.getRequestMethod;
        if (!isHttpApp) {
            return this.reflector.get(cache_constants_1.CACHE_KEY_METADATA, context.getHandler());
        }
        const request = context.getArgByIndex(0);
        if (httpServer.getRequestMethod(request) !== 'GET') {
            return undefined;
        }
        return httpServer.getRequestUrl(request);
    }
};

1.1、trackBy()

此方法传递一个context上下文进来,通过上下文获取我们请求的对象,如果是get请求,则找到此时在请求阶段promise的CacheKey的值;如果是post或其他请求方式则不做操作。

1.2、intercept()

此方法对服务端回数据制做进一步的处理,通过rxjs的分发机制,我们可以了解到,它分发了我们此次请求回来的response数据,同时也通过构造中的cacheManager来保存了当前的response。更为重要的是根据它自定义的trackBy方法获取了之前的key值,这点很关键。我们后面获取数据时的必要条件。

2、自定义拦截器:

2.1、需求

在我们开始编程的时候必须先理清楚我们需求的功能,我们需要缓存此次的验证码,并且通过key再次获取它进行进一步的验证。

2.2、分别建立两个拦截器:

PutCodeInterceptor

@Injectable()
export class PutCodeInterceptor extends CacheInterceptor {
   trackBy(context: ExecutionContext) {
     const req = context.switchToHttp().getRequest();
     return 'smsKey';
   }
}

GetCodeInterceptor

@Injectable()
export class GetCodeInterceptor extends CacheInterceptor {
  async intercept(context: ExecutionContext, call$: Observable<any>): Promise<Observable<any>> {
    const result = await this.cacheManager.get('smsKey');
    return call$.pipe(map(data => ({ result })));
  }
}

分析: PutCodeInterceptor 将key值通过request来进行获取,这里我简单的写死为'smsKey',这样便可以通过CacheIntercepter的 intercept方法获取此key来根据key缓存response。 然后作为再次获取此缓存的value ,再次添加GetCodeInterceptor 重写 CacheIntercepter 的 intercept方法 ,最终通过cacheManager的get()方法获取方才缓存的response,最终可以通过缓存的response来进行判断处理,我这里为了方便起见直接当result返回了。

3、使用:

@Controller('sms')
export class SmsController{
    constructor(private log: Log, private app: AppService) { }
    @Get('put')
    @UseInterceptors(PutCodeInterceptor)
    async testCode() {
        const rep: DoctorInfo = {
            name: '你好',
            code: this.app.createCode(),
        };
        return rep;
    }

    @Post('test')
    @UseInterceptors(GetCodeInterceptor)
    async test() {
    }

}

最终测试效果:

put:

test:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【vue随手笔记】webpack解决跨域

    这里回到BASE_URL上,只需要在原来修改的BASE_URL还原为全域名或者全地址的URL即可,毋须额外操作。

    stormKid
  • nestJs 之 fileupload 自定义路径与文件名

    这里我们知道了,nest.js 使用的是multer 来封装的,所以我们可以直接使用multer类来进行自定义处理

    stormKid
  • Okkt —— 一款针对kotlin语言封装的Okhttp网络请求库

    1、针对文件请求,重写okio计算方案,可实时显示请求文件进度,防止okhttp在直接做请求文件的时候采取的直传策略,从而导致下载文件间隔过长。

    stormKid
  • Android内存泄漏终极解决篇(下)

    一、概述 在 Android内存泄漏终极解决篇(上)中我们介绍了如何检查一个App是否存在内存泄漏的问题,本篇将总结典型的内存泄漏的代码,并给出对应的解决方案。...

    非著名程序员
  • Android使用第三方库实现日期选择器

    本文主要是介绍利用第三方库实现底部日期选择器滚轮效果,类似IOS日期效果,只记录了一种展示效果,是项目中常用到的,至于用到其他效果以及自定义扩展的可以参考原文自...

    砸漏
  • VIM的常用操作

    作为Linux开发的必不可少的工具,能够将Vi的功效发挥到极致,必然能够提高我们的工作效率,下面是一些Vi的使用技巧。

    大江小浪
  • Google Mock(Gmock)简单使用和源码分析——源码分析

            通过《Google Mock(Gmock)简单使用和源码分析——简单使用》中的例子,我们发现被mock的相关方法在mock类中已经被重新实现了,...

    方亮
  • 集成算法梳理——XGBoost

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JN_rainbow/article/details/...

    JNJYan
  • XGBoost原理与实现

    XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛...

    大数据技术与机器学习
  • 「网络基础」详解计算机网络,不仅类型有三种,还有模型分七层

    计算机网络,是指将处于不同地理位置的具有独立功能的多台计算机,通过通信线路连接起来,在操作系统的网络接口、网络管理软件以及网络通信协议的管理、协调下,实现资源共...

    老夫编程说

扫码关注云+社区

领取腾讯云代金券