跳转至

📖 后端 / 服务端 核心术语(专业词汇速查)

在进入 Node.js / NestJS 动手之前,先把后端核心专业术语的概念对齐清楚。本篇面向所有层级的程序员:从未写过后端的纯前端、刚转全栈的新人、以及想系统梳理的资深工程师。

阅读目标:一看就懂、知道"它是什么、为什么重要、哪里容易踩坑"。读完本篇,你会对"后端到底包含哪些核心内容"有一个全局地图,再进入下方的分阶实战章节就不会迷路。

所有解释均依据权威来源:

来源 说明 地址
Node.js 官方文档 Node.js 运行时 API 的官方标准 nodejs.org/docs/latest/api
NestJS 官方文档 NestJS 企业级框架权威指南 docs.nestjs.com
Express / Koa 官方 主流 Node Web 框架 expressjs.com / koajs.com
ECMA-262 / CommonJS JS 语言规范与模块规范 ecma-international.org
MDN Web Docs 含 HTTP、网络、安全权威参考 developer.mozilla.org
OWASP Web 安全权威机构(后端责任主体) owasp.org

一、运行时与语言基础

1. 运行时(Runtime)

  • 定义:让 JS 代码真正"跑起来"的环境。浏览器里有 V8 + DOM,而服务器端靠 Node.js 这类运行时提供文件、网络、进程等能力。
  • 为什么重要:同一个 console.log 在前端跑在浏览器、在后端跑在 Node,能用的 API 完全不同。理解"运行时"才能理解为什么后端能读写文件、开端口,而前端不能。
  • 避坑:不要把"浏览器 API"(如 windowdocumentfetch 在旧环境)直接用到 Node;反之亦然,Node 专属的 fsprocess 在浏览器里不存在。

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(如 readFileSyncexecSync),除非启动初始化阶段。

7. 流(Stream)与缓冲区(Buffer)

  • 定义
  • Buffer:Node 专门处理二进制数据的类(因为 JS 本身没有字节类型)。
  • Stream:把数据切成"一块块"边读边处理,不用一次性加载到内存。
  • 为什么重要:处理大文件、大响应、文件上传下载,必须用流,否则内存爆炸。
  • 避坑
  • 不要把大文件 readFile 全读进内存再处理。
  • Buffer 默认是二进制,注意字符编码(utf8/base64/latin1)转换错误会乱码。
  • 流要正确关闭 / 监听 error,否则内存泄漏。

8. 事件发射器(EventEmitter)

  • 定义:Node 核心的发布-订阅模式实现,对象可以 on 监听事件、emit 触发事件。
  • 为什么重要:很多 Node 核心模块(流、HTTP、进程)都继承自它,也是你写自定义异步通信的基础。
  • 避坑
  • 监听器泄漏(重复 onoff)会导致内存上涨、回调执行多次。
  • 忘记监听 '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 进阶

给前端同学的一句话总结

你以前只管"调接口";现在你知道了:接口背后有路由 → 中间件 → 控制器 → 服务 → 数据库,中间还有鉴权、校验、缓存、日志、限流。把这张地图记牢,下面三阶内容就是逐个展开细节与避坑。


下一步