william.chan's blog

done is better than perfect

NestJS 日志最佳实践

内置 Logger、Pino、Winston、结构化日志与生产落地一条龙

为什么日志很重要 日志是线上排障的第一手线索。日志做不好,生产出了问题只能瞎猜。一份好的日志系统需要: 结构化(JSON):机器可解析,方便 ELK / Loki / CloudWatch 查询 分级(debug / info / warn / error):过滤噪音 有 context(traceId / userId / path / latency):每条日志能串联到...

nestjs accessKey, RAM, username/password

三种凭证的本质区别,以及在 NestJS 里怎么用、怎么藏、怎么轮换

三种凭证一图区分 1 2 3 4 5 6 7 8 ┌────────────────────┬──────────────────────┬───────────────────────┐ │ username/password │ AccessKey │ RAM │ ├────────────────────┼──────...

nestjs CNAME

从 DNS 协议到自定义域名部署,再到 GitHub Pages 的 CNAME 文件

CNAME 是什么 CNAME (Canonical Name) = DNS 中的”别名”记录,把一个域名指向另一个域名。 1 2 api.example.com. IN CNAME my-app.vercel.app. my-app.vercel.app. IN A 76.76.21.21 浏览器查 api.example.com: 1 2 3 4 DNS 递...

nestjs 大文件分片上传

前端切片 + 后端合并 + 秒传 + 断点续传一条龙

为什么要分片 直接 POST 一个几 GB 的文件会遇到一连串问题: 网关 / Nginx 限制:默认 client_max_body_size 1m,超过直接 413 网络抖动:传到 90% 断了,整个文件得重传 内存压力:服务端如果用 multer.memoryStorage(),几 GB 文件直接撑爆 Node 进程 没法显示进度:单请求的 progress 颗粒...

create-vite

一行命令拉起一个现代前端工程的脚手架

一句话理解 create-vite = Vite 官方维护的项目脚手架,作用是把一份”模板目录”复制到你本地、改改 package.json 的 name,然后让你 npm install 就能跑。 它本身不是 Vite,是”生成 Vite 项目”的工具。和 create-react-app、create-next-app 是同一类东西,但更轻、更快、更通用——支持 Vanill...

PostCSS

CSS 的"Babel"——用插件流水线把现代 CSS 变成能跑的 CSS

一句话理解 PostCSS = 一个把 CSS 解析成 AST、让插件随意操作节点、再序列化回 CSS 的工具链。 它本身不做任何 CSS 转换,所有能力都来自插件。你用的 Autoprefixer、Tailwind CSS、CSS Modules——底层都是 PostCSS 插件。 1 2 3 4 5 6 7 8 9 10 CSS 源码 │ ▼ PostCSS 解析器...

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),再把结果返回给用户。用户看不到后面是几台机器、什么语言写的——这就是”反向”的含义:...