william.chan's blog

done is better than perfect

JS/TS 手写 LRU(双向链表 + 哈希)

O(1) 读写的缓存淘汰算法,前端面试高频题

什么是 LRU LRU(Least Recently Used)= 最近最少使用。当缓存满了需要淘汰一个时,淘汰最久没被访问的那个。 直觉是合理的:你刚刚用过的东西,大概率马上还会用;放了很久没碰的,留着也是占空间。 典型应用: 浏览器的 HTTP 缓存 Vue 的 <keep-alive>(用 LRU 决定哪些组件实例要被销毁) Redis、MySQL B...

nestjs express fastify

Nest 不是 Express 的替代品,而是它的"工程化包装"。

Nest 内部并没有直接依赖任何一个 http 处理的库,只是依赖了抽象的接口,想用什么库需要实现这些接口的适配器 express 是什么 Express 是 Node.js 生态里最早也是最广为人知的 Web 框架,2010 年发布,作者 TJ Holowaychuk。它做的事情很简单: 包了一层 Node 自带的 http 模块 提供路由(app.get('/...

Module 和 Provider 的循环依赖如何处理?

先各自创建,再用 forwardRef 关联。forwardRef 是”实在拆不开时的兜底方案”,不是首选方案。

什么是循环依赖 循环依赖(Circular Dependency)指的是两个或多个模块/服务互相引用对方: Module 层面:AModule 的 imports 里有 BModule,而 BModule 的 imports 里又有 AModule Provider 层面:AService 的构造函数里注入 BService,而 BService 的构造函数里又注入 AServ...

nestjs 切换不同上下文

为了让 Filter、Guard、Interceptor 支持 http、ws、rpc 等场景下复用,Nest 设计了 ArgumentsHost 和 ExecutionContext 两个类。

ArgumentsHost:抹平多协议参数差异 ArgumentsHost 是一个”参数容器”,它把不同协议下传给 handler 的参数统一封装起来,再提供方法让你按需切换到具体协议拿对应的对象。 核心 API: 方法 作用 getType() 返回当前上下文类型:'http' / 'w...

nestjs Metadata & Reflector

Nest 的实现原理是通过装饰器给 class 或对象添加元数据,然后,初始化的时候取出这些元数据,进行依赖分析,创建对应的实例对象

nest 实现的核心是 Relfect.metadata 的 api 疑问:只是通过装饰器声明了一下,启动nest应用,这时候对象就给创建好了,依赖也给注入了,这是怎么实现的呢? “design:type” “design:paramtypes” “design:returntype” 通过 Refelct.metadata 获取类和对象的元数据 疑...

nestjs 自定义装饰器

Nest 内置了很多装饰器,大多数功能都是通过装饰器来使用

什么时候需要使用自定义装饰器 1.当nest内置装饰器不能满足需求的时候 2.当装饰器比较多,需要把多个装饰器合并成一个的时候 SetMetadata, @SetMetadata:用于给路由打上“元数据”标签。不同的 metadata 有不同的业务场景。 场景举例 1:角色权限控制。有些接口只需登录,有些接口需要 admin 角色。可以用 @SetMetad...

nestjs session & cookie

在 Web 开发中,理解 HTTP 的无状态特性是掌握身份认证的前提。为了让服务器认识“你是谁”,Session 和 Cookie 这对经典的组合应运而生。

我们可以通过一个完整的业务链路,将工作原理、浏览器行为、NestJS 代码实现以及服务端存储方案串联起来,形成一个全局的认知。 1. 核心模型:银行账户与银行卡 HTTP 协议本身是没有记忆的。为了维持状态: Session(会话) 就像你在银行开通的账户,你的余额、信用等级都安全地保存在银行的内网系统(服务器端)里。 Cookie(饼干) 就像银行发给你的银行卡。卡上不...

nestjs 核心装饰器有哪些

NestJS 深度依赖 TypeScript 装饰器(Decorators)来实现依赖注入、路由分发和面向切面编程(AOP)。

NestJS 广泛使用了装饰器(Decorators)来定义和组织代码。以下是 NestJS 中最核心和最常用的一些装饰器,按照它们的功能进行分类: 1. 模块与提供者 (Modules & Providers) @Module(): 用于类,将其标记为 Nest 模块。接收一个对象,包含 imports(导入其他模块)、controllers(当前模块下的控制器)、pro...

AOP 架构

AOP的好处是可以把一些通用逻辑分离到切面中,保持业务逻辑的纯粹性,这样切面逻辑就可以复用,还可以动态增删

MVC 架构 在 MVC 架构下,请求会先发送给 controller,由 controller 调度 model 层的 service 来完成 业务逻辑,然后,返回对应的 view。 在这个流程中,nest 还提供了 AOP(Aspect Oriented Programming)的能力,也就是面向切面编程的能力。 后端框架基本都是 AOP 架构 QA: ruby ...

Nest 全局模块和生命周期

避免重复 imports。支持在创建和销毁时执行一些逻辑。

全局模块 module 导出 provider,另一个 module 需要 imports 它才能用这些 provider。 如果这个模块被很多模块依赖,那每次都要 imports 就很麻烦。 能不能设置成全局的,它导出的 provider 直接可用呢? 1.常用引入模块方式 在 AaaModule 里指定 exports 的 provider 然后,在 BbbModule ...