william.chan's blog

done is better than perfect

nestjs SSE, EventSource

服务器主动推消息给浏览器的"轻量版 WebSocket"

一句话理解 SSE(Server-Sent Events)= 浏览器开一个长连接,服务器单向、源源不断地往浏览器推 text 消息。 它是 HTML5 标准的一部分,浏览器侧用 EventSource API 接收,服务器侧返回 Content-Type: text/event-stream 的特殊响应即可。NestJS 通过 @Sse() 装饰器原生支持。 1 2 3 4 浏...

nestjs rxjs firstValueFrom, lastValueFrom

把 Observable 转成 Promise 的两个标准 API

一句话理解 firstValueFrom / lastValueFrom = 把一个 Observable 转成 Promise,让它能配合 await 用。 NestJS 的 HttpService(@nestjs/axios)、ClientProxy.send()(微服务)、CacheStore.get() 等很多 API 返回的都是 RxJS 的 Observable<...

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 获取类和对象的元数据 疑...