📖 后端 / 服务端 核心术语(专业词汇速查)¶
在进入 Node.js / NestJS 动手之前,先把后端核心专业术语的概念对齐清楚。本篇面向所有层级的程序员:从未写过后端的纯前端、刚转全栈的新人、以及想系统梳理的资深工程师。
阅读目标:一看就懂、知道"它是什么、为什么重要、哪里容易踩坑"。读完本篇,你会对"后端到底包含哪些核心内容"有一个全局地图,再进入下方的分阶实战章节就不会迷路。
所有解释均依据权威来源:
来源 说明 地址 Node.js 官方文档 Node.js 运行时 API 的官方标准 nodejs.org/docs/latest/apiNestJS 官方文档 NestJS 企业级框架权威指南 docs.nestjs.comExpress / Koa 官方 主流 Node Web 框架 expressjs.com/koajs.comECMA-262 / CommonJS JS 语言规范与模块规范 ecma-international.orgMDN Web Docs 含 HTTP、网络、安全权威参考 developer.mozilla.orgOWASP Web 安全权威机构(后端责任主体) owasp.org
一、运行时与语言基础¶
1. 运行时(Runtime)¶
- 定义:让 JS 代码真正"跑起来"的环境。浏览器里有 V8 + DOM,而服务器端靠 Node.js 这类运行时提供文件、网络、进程等能力。
- 为什么重要:同一个
console.log在前端跑在浏览器、在后端跑在 Node,能用的 API 完全不同。理解"运行时"才能理解为什么后端能读写文件、开端口,而前端不能。 - 避坑:不要把"浏览器 API"(如
window、document、fetch在旧环境)直接用到 Node;反之亦然,Node 专属的fs、process在浏览器里不存在。
2. V8 引擎¶
- 定义:Google 开发的 JS 引擎,Node.js 和 Chrome 都用它执行 JS。它把 JS 编译成机器码运行。
- 为什么重要:Node 的高性能、事件循环机制都建立在 V8 之上。理解 V8 的单线程执行模型,是理解"为什么 Node 适合 I/O、不适合 CPU 密集"的前提。
- 避坑:V8 有内存上限(默认约 2GB,老版本更小)。处理大文件/大对象时容易 OOM(内存溢出),需要流式处理或调大限制。
3. 模块系统:CommonJS(CJS)与 ESM¶
- 定义:
- CommonJS:Node 传统的模块规范,用
require()引入、module.exports导出,是同步加载、运行时解析。 - ESM(ES Modules):JS 官方标准模块,用
import/export,支持静态分析、Tree-shaking,是浏览器和现代 Node 推荐方案。 - 为什么重要:这是所有后端代码组织方式的基础。现在 Node 同时支持两种,但一个文件不能混用。
- 避坑(高频坑):
package.json里"type": "module"会让.js默认按 ESM 解析;没有则默认 CJS。- CJS 里用
import会报错,ESM 里用require也会报错。 __dirname、__filename在 ESM 中不存在,需用import.meta.url推导。- 顶层
await只能在 ESM 用。
4. 进程与线程(Process / Thread)¶
- 定义:进程是程序运行的最小资源单位(一个 Node 进程);线程是进程内真正执行代码的单元。
- 为什么重要:Node 主逻辑跑在单线程(事件循环),但底层 I/O 由 libuv 线程池完成。CPU 密集任务会卡住单线程。
- 避坑:
- 不要在请求处理里写
for循环算大数、同步读大文件,会阻塞整个事件循环,所有请求都变慢。 - CPU 密集任务请用
worker_threads或拆成独立进程 / 微服务。
二、核心运行机制¶
5. 事件循环(Event Loop)¶
- 定义:Node 用单线程 + 事件循环处理并发。它不断从任务队列取出回调执行,使"单线程"也能高并发处理 I/O。
- 为什么重要:这是 Node 的心脏。理解它才能解释"为什么异步代码顺序看起来反直觉"。
- 六个阶段(面试/避坑高频):timers → pending callbacks → idle/prepare → poll → check → close callbacks。常用
setTimeout(timers)、setImmediate(check)、Promise(微任务,穿插各阶段之间)。 - 避坑:
setTimeout(fn, 0)不等于"立刻",受阶段调度影响,通常比setImmediate慢一拍。- 微任务(Promise.then / process.nextTick)优先于宏任务,容易写出"顺序错乱"的 bug。
6. 阻塞 vs 非阻塞 / 同步 vs 异步¶
- 定义:
- 阻塞/同步:调用后必须等结果返回才继续(如
fs.readFileSync)。 - 非阻塞/异步:调用后立即返回,结果通过回调/Promise/async 通知(如
fs.readFile)。 - 为什么重要:Node 的优势在非阻塞 I/O。写错成同步阻塞,高并发性能直接崩。
- 避坑:生产代码禁止在请求路径用
*Sync同步 API(如readFileSync、execSync),除非启动初始化阶段。
7. 流(Stream)与缓冲区(Buffer)¶
- 定义:
- Buffer:Node 专门处理二进制数据的类(因为 JS 本身没有字节类型)。
- Stream:把数据切成"一块块"边读边处理,不用一次性加载到内存。
- 为什么重要:处理大文件、大响应、文件上传下载,必须用流,否则内存爆炸。
- 避坑:
- 不要把大文件
readFile全读进内存再处理。 Buffer默认是二进制,注意字符编码(utf8/base64/latin1)转换错误会乱码。- 流要正确关闭 / 监听 error,否则内存泄漏。
8. 事件发射器(EventEmitter)¶
- 定义:Node 核心的发布-订阅模式实现,对象可以
on监听事件、emit触发事件。 - 为什么重要:很多 Node 核心模块(流、HTTP、进程)都继承自它,也是你写自定义异步通信的基础。
- 避坑:
- 监听器泄漏(重复
on不off)会导致内存上涨、回调执行多次。 - 忘记监听
'error'事件,出错时进程会直接崩溃退出。
三、Web 服务与网络¶
9. HTTP / HTTPS¶
- 定义:Web 通信的基础协议。HTTP 是明文,HTTPS = HTTP + TLS 加密。
- 为什么重要:后端本质就是"接收 HTTP 请求、返回 HTTP 响应"。理解方法(GET/POST/PUT/DELETE)、状态码(200/301/400/401/403/404/500)、请求头/响应头、Cookie 是最小常识。
- 避坑:
- 不要在 URL/Query 里放敏感信息(会进日志、浏览器历史)。
- 401(未认证)与 403(无权限)很多人混用,语义要分清。
- 生产必须 HTTPS,明文传输密码/Token 等于裸奔。
10. 端口(Port)与监听(Listen)¶
- 定义:一台机器上用端口号(0~65535)区分不同服务。后端
app.listen(3000)即在 3000 端口等待请求。 - 为什么重要:前后端联调、部署、容器映射都靠端口。
- 避坑:
- 1024 以下为系统保留端口,普通用户通常不能用(如 80 需权限)。
- 端口被占用会
EADDRINUSE,先lsof/kill或换端口。 - 生产不要硬编码端口,用环境变量(
process.env.PORT)。
11. 反向代理(Reverse Proxy)¶
- 定义:位于后端前面的"中间人"(如 Nginx、Caddy),负责接收公网请求、转发给内网 Node 服务,可做 TLS 终止、负载均衡、静态资源、限流。
- 为什么重要:生产环境几乎必有反向代理,Node 一般不需要直接暴露公网。
- 避坑:
- 代理后
req.ip会变成代理 IP,需用X-Forwarded-For并配置trust proxy,否则限流/审计失效。 - 静态文件交给 Nginx,别让 Node 去
sendFile大文件。
12. CORS(跨域资源共享)¶
- 定义:浏览器出于安全,限制前端跨域请求;后端通过响应头(如
Access-Control-Allow-Origin)授权哪些源可访问。 - 为什么重要:前后端分离联调 90% 的"请求失败"都是 CORS 问题。
- 避坑:
- 别图省事写
Access-Control-Allow-Origin: *又带Credentials,浏览器会拒绝。 - 带 Cookie/鉴权的请求是非简单请求,会先发
OPTIONS预检,后端必须正确处理。
四、框架与架构概念¶
13. 中间件(Middleware)¶
- 定义:一串可串联的处理函数,每个都能访问请求/响应,并决定是否交给下一个。Express/Koa/Nest 的核心机制。
- 为什么重要:鉴权、日志、CORS、错误处理都用中间件实现。
- 避坑:
- 忘记调用
next()会导致请求挂起无响应。 - 错误处理中间件必须 4 个参数
(err, req, res, next),参数少了不识别。 - 中间件顺序很重要(先 CORS 后路由,先鉴权后业务)。
14. 路由(Route)¶
- 定义:把"某 URL + 某方法"映射到某个处理函数。如
GET /users→ 返回用户列表。 - 为什么重要:这是后端接口的入口组织方式。
- 避坑:
- 路由顺序敏感,
/users/:id写在/users/me前面会先匹配,导致me被当 id。 - 路径参数与查询参数别混。
15. 依赖注入(DI, Dependency Injection)¶
- 定义:NestJS 的核心思想——类不自己
new依赖,而是由框架"注入"。配合装饰器(Decorator)(如@Injectable()、@Controller())声明。 - 为什么重要:让代码解耦、可测试、可替换实现(如测试时换 Mock)。
- 避坑:
- 循环依赖(A 注入 B,B 又注入 A)会报错,需用
@ForwardRef()或重构。 - Provider 没在模块
providers注册就用不了,新手常漏。
16. 装饰器(Decorator)¶
- 定义:ES 提案语法(NestJS 重度使用),以
@XXX形式给类/方法/参数附加元信息。如@Get()、@Body()、@UseGuards()。 - 为什么重要:Nest 的"声明式"全靠它,看装饰器就知道这个接口干嘛、要校验什么、要不要鉴权。
- 避坑:装饰器本质是实验性特性,ESM 下需
experimentalDecorators(TS 配置),否则报错。
17. 控制器 / 服务 / 模块(Controller / Service / Module)¶
- 定义(NestJS 三件套):
- Controller:接收请求、返回响应(薄层,不做业务)。
- Service:放业务逻辑(可复用、可注入)。
- Module:把相关的 Controller/Service 打包成内聚单元。
- 为什么重要:这是企业级代码组织的骨架,避免"所有逻辑堆在一个函数里"。
- 避坑:
- 别在 Controller 写业务逻辑,否则无法复用和单测。
- 跨模块用别的 Service 必须
exports+imports,否则注入为undefined。
18. DTO(Data Transfer Object,数据传输对象)¶
- 定义:专门描述"接口进出数据形状"的类/接口,常配合
class-validator做校验。 - 为什么重要:用类型 + 校验把"脏数据"挡在业务之外,是后端安全和健壮性的第一道关。
- 避坑:永远不要信任前端传来的数据,必须校验。没校验的接口 = 注入/越权温床。
五、数据、缓存与安全¶
19. 数据库(Database)与 ORM¶
- 定义:持久化存储数据。关系型(PostgreSQL/MySQL)用 SQL;ORM(Prisma/TypeORM)用代码操作数据库,屏蔽 SQL 差异。
- 为什么重要:后端 80% 工作围绕"存数据、取数据、别搞丢"。
- 避坑:
- SQL 注入:永远用参数化查询/ORM,别字符串拼接 SQL(OWASP Top 10 常客)。
- 连库要用连接池,别每次请求都新建连接。
- 生产明文密码、密钥写死在代码里 = 重大事故。
20. 缓存(Cache,典型 Redis)¶
- 定义:把热点数据放更快的存储(内存),减少数据库压力。Redis 是主流。
- 为什么重要:高并发系统的标配,能扛量、降延迟。
- 避坑:
- 缓存与数据库一致性:先更新 DB 还是先删缓存,顺序错会读到旧数据。
- 缓存必须设过期时间,否则无限增长撑爆内存。
- 防缓存穿透/击穿/雪崩(空值缓存、互斥锁、随机过期)。
21. 鉴权与授权(Authentication / Authorization)¶
- 定义:
- 认证(AuthN):你是谁(登录、JWT、Session)。
- 授权(AuthZ):你能干什么(角色、权限)。
- 为什么重要:几乎所有业务系统都要,也是安全重灾区。
- 避坑:
- JWT 别存敏感信息,且服务端要有吊销机制(否则没法踢人下线)。
- 把 401/403 分清;越权(A 用户访问 B 数据)比没登录更危险。
- 密码必须用加盐哈希(bcrypt/argon2),绝不可明文/弱哈希(MD5/SHA 裸用)。
22. 环境变量与配置(Env / Config)¶
- 定义:把数据库密码、端口、密钥等"随环境变"的东西放环境变量(如
.env),不进代码仓库。 - 为什么重要:一套代码跑开发/测试/生产,靠配置切换。
- 避坑:
.env必须加进.gitignore,否则密钥泄露。- 生产配置别用开发默认值(如关掉鉴权)。
六、工程化与运维¶
23. 包管理(npm / pnpm / yarn)¶
- 定义:管理第三方依赖。
package.json声明依赖,node_modules装依赖。 - 为什么重要:后端重度依赖生态(框架、ORM、工具)。
- 避坑:
- 锁文件(
package-lock.json/pnpm-lock.yaml)必须提交,保证团队/部署版本一致。 - 定期
npm audit查漏洞,供应链安全(见 前端安全全集)。
24. 错误处理与日志(Error / Log)¶
- 定义:统一捕获异常、记录运行信息(级别:debug/info/warn/error)。
- 为什么重要:没日志 = 线上出事两眼一抹黑。
- 避坑:
- 未捕获异常/拒绝会让进程退出,生产要用进程管理器(PM2 /
cluster/ Docker restart)兜底。 - 日志别打敏感信息(密码、Token、身份证)。
- 用
winston/pino等专业库,别全用console.log(无级别、无落盘)。
25. 进程管理 / 集群(Cluster / PM2 / Docker)¶
- 定义:Node 单进程单线程,利用多核需多进程(cluster 模式起多个 Worker)。PM2/Docker 负责守护、重启、扩缩容。
- 为什么重要:生产要靠它们保证"挂了自动拉起、吃满 CPU"。
- 避坑:
- 多进程下内存状态不共享(Session 别存进程内存,存 Redis)。
- 平滑重启要处理"正在处理的请求",否则丢请求。
26. 限流 / 熔断 / 降级¶
- 定义:保护系统的三件套——限流(控制 QPS)、熔断(依赖挂了快速失败)、降级(高峰期关非核心功能)。
- 为什么重要:防雪崩、防恶意刷接口。
- 避坑:限流要基于真实用户标识(IP/用户 ID),别被代理 IP 误伤或绕过。
27. 微服务(Microservices)¶
- 定义:把单体拆成多个独立部署的小服务,通过消息/HTTP 通信(NestJS 支持 NATS/RabbitMQ/Kafka 等传输层)。
- 为什么重要:大团队解耦、独立扩容。
- 避坑:不要为了微服务而微服务。小项目上微服务 = 运维灾难(分布式事务、链路追踪、网络开销)。
28. WebSocket(实时双向通信)¶
- 定义:在 HTTP 握手后升级为长连接,服务端可主动推消息(聊天、通知、行情)。
- 为什么重要:传统 HTTP 一问一答做不到"服务端主动推"。
- 避坑:
- 长连接占资源,注意连接数上限与心跳保活。
- 多进程下需用 Redis 适配器做广播,否则 A 进程的用户收不到 B 进程发的消息。
七、后端核心内容全景地图(统筹)¶
读完上面 28 个术语,后端核心内容可归纳为 6 大板块,下方分阶章节一一对应:
| 板块 | 解决什么 | 对应章节 |
|---|---|---|
| ① 运行时与语言 | JS 怎么在服务器跑、模块怎么组织 | Node.js 基础 |
| ② 运行机制 | 事件循环、流、异步、进程线程 | Node.js 基础 / 高级 |
| ③ Web 服务与网络 | HTTP、端口、代理、CORS、TLS | Node.js 高级 |
| ④ 框架与架构 | 中间件、路由、DI、Controller/Service、DTO | NestJS 基础 / 高级 |
| ⑤ 数据·缓存·安全 | 数据库、ORM、Redis、鉴权、配置 | Node.js 进阶 / NestJS 进阶 |
| ⑥ 工程化与运维 | 日志、集群、限流、微服务、WebSocket、部署 | Node.js 进阶 / NestJS 进阶 |
给前端同学的一句话总结
你以前只管"调接口";现在你知道了:接口背后有路由 → 中间件 → 控制器 → 服务 → 数据库,中间还有鉴权、校验、缓存、日志、限流。把这张地图记牢,下面三阶内容就是逐个展开细节与避坑。
下一步¶
- 想先打运行时基础 → Node.js 基础
- 想直接上企业级框架 → NestJS 基础
- 想了解前端怎么和后端协作 → 给后端的前端速通
- 后端安全责任清单 → 前端安全全集