本附录归纳了 Node.js 技术面试中出现频率最高的问题,并按主题分组。每个问题后标注了核心考点,读者可对照本手册的对应章节快速回顾原理。面试时,能结合真实项目场景和底层机制作答,会比单纯背诵答案更具说服力。
C.1 基础认知与设计理念
Q1:Node.js 是什么?跟浏览器里的 JavaScript 有什么区别?
- 核心考点:Node.js 基于 V8 的服务端运行时、事件驱动与非阻塞 I/O、服务端能力(文件系统、网络、进程等)与浏览器沙箱的差异。
- 参考章节:1.1、1.2
Q2:Node.js 适合什么场景?不适合什么场景?
- 核心考点:I/O 密集型(Web 服务、API 网关、实时通信、BFF)vs CPU 密集型(计算、图像视频处理),单线程模型的优势与边界。
- 参考章节:1.1.4、1.3.2
Q3:Node.js 是单线程的吗?如何利用多核 CPU?
- 核心考点:JS 主线程单线程,libuv 线程池,cluster 模块多进程共享端口,worker_threads 多线程处理计算。
- 参考章节:1.2.3、10.3、10.4
C.2 事件循环与异步编程
Q4:简述 Node.js 事件循环的六个阶段及微任务执行时机。
- 核心考点:定时器、待定回调、轮询、检查、关闭回调六个阶段顺序,以及 process.nextTick 和 Promise.then 在每个阶段转换时的清空规则,宏任务与微任务的优先级。
- 参考章节:3.3、1.2.3
Q5:setTimeout(fn,0)、setImmediate(fn)、process.nextTick(fn) 的执行顺序有何不同?
- 核心考点:nextTick 的微任务立即执行,setTimeout 与 setImmediate 的先后取决于调用时的上下文和轮询阶段,面试时常要求说明在同一个 tick 中的顺序。
- 参考章节:3.3、11.3
Q6:Promise 和 async/await 在事件循环中是怎样执行的?
- 核心考点:Promise 回调是微任务,async/await 是语法糖,遇到 await 会跳出异步函数让出线程,等待期约落定后再以微任务恢复执行。
- 参考章节:4.3、3.3
Q7:如何避免回调地狱?async/await 的错误如何捕获?
- 核心考点:Promise 链、async/await、try/catch,以及全局 unhandledRejection 处理。
- 参考章节:4.3、11.1
C.3 模块系统
Q8:CommonJS 模块的 require 加载流程是怎样的?
- 核心考点:路径解析→文件定位→编译执行→缓存返回,以及 module.exports 与 exports 的区别(本质引用)。
- 参考章节:5.1
Q9:CommonJS 和 ES Modules 的核心区别是什么?它们能混用吗?
- 核心考点:加载时机(运行时 vs 编译时)、输出值的拷贝 vs 只读引用、this 指向、动态/静态导入,混用时的限制与注意事项。
- 参考章节:5.3
Q10:什么是循环引用?在 Node.js 中循环引用会发生什么?
- 核心考点:模块缓存机制导致部分导出为未完成对象,示例输出,设计上应避免。
- 参考章节:5.2
C.4 核心 API 与内置模块
Q11:Buffer 是什么?与普通字符串有何区别?
- 核心考点:缓冲区用于处理二进制数据,堆外内存,与 TypedArray 的关系,编码转换,操作原语。
- 参考章节:6.3、25.1
Q12:Stream 流的类型有哪些?背压(Backpressure)是怎么工作的?
- 核心考点:可读、可写、双工、转换流,pipe 管道中的数据自动积压与暂停/恢复机制,手动实现流控的原理。
- 参考章节:7.2、7.3、7.4
Q13:child_process 的 spawn、exec、execFile、fork 有什么区别?
- 核心考点:缓冲输出 vs 流式输出,是否启动 shell,专用于 Node 模块的 fork 与 IPC 通道。
- 参考章节:10.2
Q14:如何创建一个简单的 HTTP 服务器?原生模块与框架的关系?
- 核心考点:http.createServer 的基本用法,请求/响应对象的常用属性和事件,框架(Express、Koa)在原生基础上的封装。
- 参考章节:9.1、12.1、12.2
C.5 内存与 GC
Q15:V8 的内存结构是怎样的?新生代和老生代分别用什么 GC 算法?
- 核心考点:Scavenge(复制算法)用于新生代,Mark-Sweep 和 Mark-Compact 用于老生代,增量标记和并发标记减少停顿。
- 参考章节:6.1、6.2
Q16:Node.js 应用中常见的内存泄漏原因有哪些?如何定位?
- 核心考点:全局变量、闭包引用、未清理的定时器/事件监听,使用 heapdump、Chrome DevTools、clinic 等工具生成堆快照进行分析。
- 参考章节:6.4、27.2
C.6 性能优化
Q17:有哪些常见的措施可以提升 Node.js 服务的性能?
- 核心考点:避免阻塞事件循环(拆分 CPU 任务、使用 Worker)、启用 cluster/PM2 利用多核、流式处理大请求、数据库连接池与查询优化、缓存策略、开启 Gzip 压缩。
- 参考章节:第20章、21.2
Q18:process.nextTick 滥用会有什么问题?
- 核心考点:nextTick 回调过多会导致 I/O 饥饿,因为它在每轮当前阶段结束后立即全部执行,可能让事件循环无法进入 Poll 阶段接收新 I/O。
- 参考章节:3.3、20.1
C.7 安全
Q19:Node.js 应用中如何防范常见的 Web 攻击?
- 核心考点:SQL 注入(参数化查询)、XSS(输出编码)、CSRF(Token 验证)、文件上传漏洞(限制类型、不执行上传文件),使用 helmet 中间件加强 HTTP 头。
- 参考章节:21.1
Q20:JWT 的工作原理及安全性重点是什么?
- 核心考点:无状态 token,签名防止篡改,过期管理,避免在 payload 中存储敏感信息,refresh token 机制,secret 保护。
- 参考章节:14.1
C.8 框架与生态
Q21:Express 和 Koa 的区别是什么?各自中间件机制有何不同?
- 核心考点:Express 基于回调的线性中间件,Koa 洋葱模型 + async/await,错误捕获方式的差异,脚手架和生态对比。
- 参考章节:12.1、12.2
Q22:进程守护工具 PM2 的核心功能与常用命令。
- 核心考点:进程守护、自动重启、集群模式、负载均衡、日志管理、多项目配置。
- 参考章节:19.1
C.9 综合场景与设计
Q23:如何设计一个高并发的 Node.js 在线聊天服务?
- 核心考点:WebSocket/Socket.IO 长连接,房间管理,多进程/多节点下的消息同步(Redis 发布/订阅或 MQ),心跳机制与断线重连,水平扩展方案。
- 参考章节:22.1、22.2、23.2
Q24:BFF 层的主要职责及使用 Node.js 的实现思路。
- 核心考点:接口聚合、数据裁剪与适配、缓存与降级、前端友好,使用 async/await 并发调用下游服务,超时控制与断路器。
- 参考章节:24.1
Q25:你遇到过的最棘手的一个 Node.js 线上问题是什么?如何排查并解决的?
- 核心考点:考察实战经验与排查思路,需要结合具体案例(如内存泄漏、CPU 飙高、异步错误导致崩溃等),体现工具使用(heapdump、火焰图、日志分析)和修复过程。
- 参考章节:27.6
面试的深度往往取决于候选人能否将零散的知识点串联成完整的运行模型。本手册的第二篇核心原理、第五篇工程化和第六篇性能优化尤其值得反复精读——它们覆盖了面试官最期望听到的“从原理到实践”的回答逻辑。