william.chan's blog

done is better than perfect

nestjs abstract, public, protected, private, readonly

NestJS 项目中最常见的 5 个 TS 类成员关键字

一句话理解 关键字 一句话描述 编译期 / 运行期 abstract 不能被 new,只能被继承 编译期 + 运行期(生成空类) public 谁都能访问(默认值,可省略) 仅编译期 ...

反向代理

用户访问的是它,但真正干活的是后面的服务器

一句话理解 反向代理(Reverse Proxy)= 站在后端服务器前面,替它接收请求、转发响应的”门面”。 用户以为自己访问的是 https://api.example.com,其实请求先打到一台 Nginx,然后 Nginx 内部决定把它转发给哪台真实服务器(NestJS 实例 A、B、C),再把结果返回给用户。用户看不到后面是几台机器、什么语言写的——这就是”反向”的含义:...

rxjs 是什么?解决了什么问题?

把"异步事件流"当数组来玩,前端和 NestJS 都在用

https://rxjs.dev/guide/operators https://rxmarbles.com/ Marble diagrams - 弹珠图 RxJS 是什么 RxJS = Reactive Extensions for JavaScript,把异步数据”事件流化”,再用一套类似数组方法的操作符(map / filt...

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(饼干) 就像银行发给你的银行卡。卡上不...