本节摘要:异步是 Node 的底层能力,部署是上线的最后一步。本节讲清事件循环的直觉(单线程但能并发)、异步的三种写法(回调、Promise、async/await)、以及 Node 应用的部署要点。
阅读完本节,你应当能够:
"Node 单线程,怎么扛高并发?"——靠事件循环:Node 不"排队等待"每个请求做完,而是"来了就处理,等 I/O 时去干别的"。像餐厅一个服务员同时照看多桌:点单(请求)进来,下单后不等上菜,先去服务下一桌——这就是"异步不阻塞"。

等待时不闲着——这是 Node 高并发的秘密。
| 写法 | 时代 | 说明 |
|---|---|---|
| 回调 | 早期 | 嵌套深 |
| Promise | 中期 | .then 链 |
| async/await | 现代 | 最清晰 |
💡 关键直觉:async/await 是"同步的写法,异步的行为"——代码像同步一样直读,底层仍是异步。写新代码一律用它。
| 要点 | 说明 |
|---|---|
| 进程管理 | PM2 等守护进程 |
| 环境变量 | 端口、密钥走环境 |
| 反向代理 | Nginx 转发 |
| 容器化 | Docker 打包 |
⚠️ 常见坑:裸跑 node 命令上线。进程崩了没人拉起——用进程管理器(PM2)守护,崩了自动重启。
端口与代理配置正确 环境变量已设置 进程有守护 日志有记录
| 框架 | 部署要点 |
|---|---|
| Spring Boot | java -jar |
| Django | Gunicorn + Nginx |
| Node.js | PM2 + Nginx |
Node.js 主线走完,四个章节全部收官。回到导读页对比三框架——Spring 企业重、Django 全栈快、Node 轻量灵,按项目需求选型,然后亲手建一个自己的后端应用。
Q1:Node 单线程为什么还能高并发?
关键在"事件循环"和"非阻塞 I/O"。Node 的主线程只有一个,但遇到 I/O(读写数据库、访问文件、网络请求)时不干等,而是继续处理下一个请求;I/O 完成后再回来处理结果。所以"同时服务大量请求"靠的不是多线程,而是"等待时不闲着"。这也解释了为什么 Node 适合 I/O 密集场景——大量时间都花在等待上,等待时它能同时忙很多事。
Q2:回调、Promise、async/await 有什么进化关系?
回调是早期写法,层层嵌套(回调地狱),代码难读难维护;Promise 用链式调用解决嵌套,但链长了还是绕;async/await 是建立在 Promise 之上的语法糖,让异步代码写得像同步一样直观——一个 await 等结果,出错用 try/catch。实践原则很明确:写新代码一律用 async/await,老代码里看到 Promise 也能读懂。
Q3:async/await 的写法为什么重要?
因为它把"异步的思维负担"降到最低:代码顺序读下来就是执行顺序,不用在回调里绕来绕去。前端也在用这套(fetch 就是 Promise),掌握了 async/await,你在 Node 后端、前端请求、甚至脚本工具里都能统一用同一套异步心智。这也是它成为现代 JavaScript 事实标准的原因。
Q4:生产环境为什么不能裸跑 node 命令?
因为裸跑没有守护:进程崩溃(异常没兜住、机器重启)就没人自动拉起,服务就挂了。标准做法是用进程管理器(PM2):PM2 负责启动应用、崩溃自动重启、记录日志、开机自启、负载均衡(多实例)。所以部署清单里有一条"进程有守护"——这不是可选项,是生产底线。
动手建议:先做"异步对比实验":分别用回调、Promise、async/await 写一个模拟延时操作,观察三种写法的代码形态差异,体会 async/await 的简洁。然后做"部署演练":安装 PM2,用 PM2 启动你的 Express 应用,故意让接口抛一个未捕获异常,观察 PM2 是否自动重启进程、日志是否记录。再配置环境变量(端口、密钥走 process.env)并验证生效。这一套做完,你不仅会用 Node 写接口,还知道怎么让它稳定地跑在生产环境。
本节练习的目标,是把异步写法和生产部署各练一遍。步骤如下:
第一步,对比三种写法。用回调、Promise、async/await 三种方式分别写一个"延时返回数据"的函数,观察三种代码的形态差异。验收标准:你能说出三种写法各自的代码特点。
第二步,用 async/await 重写一个接口。把之前写的某个异步接口改用 async/await,并加上 try/catch 处理错误。验收标准:接口功能不变,但代码更清晰,异常被兜住。
第三步,验证等待行为。在一个接口里连续查询两次数据库,观察两次 await 的串行顺序;再写两个互不依赖的查询,用并发方式并行执行,对比耗时。验收标准:你理解了"该串行串行、该并行并行"。
第四步,安装进程守护工具(PM2),用它启动你的应用。验收标准:PM2 显示应用处于运行状态。
第五步,测试自动重启。故意让应用抛一个未捕获异常(或手动杀掉进程),观察 PM2 是否自动拉起。验收标准:应用崩溃后自动重启,服务没有长时间中断。
第六步,配置环境变量。把端口、密钥等敏感信息改成从环境变量读取,在启动时传入。验收标准:应用从环境变量拿到配置,代码里不再硬编码。
六步走完,你既会写现代的异步代码,也知道怎么让应用在生产环境稳定跑着。异步是 Node 的魂,守护是上线的底线,两者都亲手验证过,你才算真正学完 Node 的这一课。
异步写法的进化是回调到 Promise 再到 async/await,新代码一律用 async/await;部署的底线是进程有守护、配置走环境变量。写一遍异步、守一次进程,Node 的最后一课就真正结课了。