william.chan's blog

done is better than perfect

nestjs sql join

彻底掌握一对一、多表连接(JOIN)查询与级联操作

在实际的业务开发中,数据往往不会一股脑地全塞在一张表里,为了避免数据冗余和维护一致性,通常会通过拆表把数据分散存放在多张关联表中(即数据库的范式设计)。这就意味着,我们需要在查询时把分散的数据重新拼凑起来。这就离不开强大的 JOIN(连接) 查询,以及配套使用的 级联(Cascade)外键约束。 1. 多表连接查询(JOIN) JOIN 是 SQL 中用于把两张或多张表横向结合起来的操作...

nestjs mysql sql

MySQL 基础查询语法与常用内置函数实战精讲

在 NestJS 的后端开发中,无论是手写 SQL 还是使用 TypeORM、Prisma 等 ORM 框架,扎实的数据库查询基本功都是必不可少的。为了演示查询,我们可以连接到 MySQL 数据库,建立一张 student 表,插入一些基础数据,并用这些数据来练习各种查询语法和函数。 1. 基础查询语法 灵活组合以下各种查询条件,就可以应对日常开发中绝大多数的需求。 where:...

nestjs mysql workbench

MySQL Workbench GUI

MySQL Workbench GUI 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 use `hello_mysql`; -- DQL SELECT * FROM `hello_mysql`....

nestjs pm2最佳实践

生产环境下的单机集群伸缩、进程管理与优雅停机方案

Node.js 默认是单线程运行的。这意味着如果你把编译好的 NestJS 应用丢到服务器上直接 node dist/main.js,它只能利用可怜的一个 CPU 核心;而且如果进程抛出了一个未捕获的异常,整个服务会直接崩溃宕机。 为了解决这些问题,我们需要引入生产级的进程管理器——PM2。 1. 为什么需要 PM2? 崩溃自动重启 (Auto Restart):服务意外挂掉后能...

nestjs Dockerfile 技巧

最佳实践:构建极小、极快、安全的 NestJS 生产级镜像

在上一篇文章中,我们了解了 Docker 的基本概念。对于一个 Node.js/NestJS 开发者来说,真正上手遇到的第一关就是写出一个合格的 Dockerfile。 如果你只是简单粗暴地把代码拉进去跑 npm run start:prod,你可能会得到一个体积超过 1GB、每次构建都要等半天、且用 root 权限裸奔的“毒药”镜像。本文介绍 NestJS 镜像打包的最佳实践。 1. ...

Docker 基本概念

镜像、容器、仓库、数据卷与网络,一文搞懂容器化核心

一句话理解 Docker = 代码的集装箱。 把你的代码、运行环境(Node.js)、配置文件、甚至整套 Linux 底层依赖,全部打包到一个箱子里。不管这个箱子拉到开发机、测试服、还是生产环境的集群部署,它的表现绝对一致,彻底消灭 “It works on my machine”(在我电脑上好好的,怎么上去就挂了)。 三大核心概念 这三个概念构成了 Docker 的生命周期...

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 颗粒...