# 1. Node.js 事件循环的六个阶段(timers/pending/poll/check/close)与浏览器事件循环的差异?setImmediate 与 setTimeout(0) 的执行顺序为何不确定? A setImmediate 与 setTimeout(0) 的顺序总是确定的 B Node 事件循环按 timers/poll/check 等阶段轮转,阶段间插入微任务,setImmediate 与 setTimeout(0) 分属相邻阶段,顺序取决于定时器到期时序而不确定 ✓ 正确答案 C 浏览器与 Node 的事件循环完全相同 D process.nextTick 与 Promise 在同一队列
# 2. Node.js 单线程为什么能支撑高并发?libuv 线程池处理哪些任务(fs/dns/crypto)? A Node 单线程靠非阻塞 I/O 与事件驱动支撑高并发,libuv 线程池处理 fs/dns/crypto 等任务,CPU 密集任务需 worker/子进程治理 ✓ 正确答案 B libuv 线程池默认 100 线程 C Node 用多线程处理所有请求 D 文件读写不经过线程池
# 3. Koa 洋葱模型中间件的实现原理,compose 函数如何串联 async 中间件并保证 next 后置逻辑的执行顺序? A 洋葱模型的前后置逻辑都是顺序执行的 B 中间件可以不 await next() C Koa compose 用嵌套 Promise 链串联中间件,await next() 保证下游完成后执行上游后置逻辑,next 只调用一次并由索引防重入 ✓ 正确答案 D 错误只能在最内层处理
# 4. Node.js 事件循环的六个阶段与 process.nextTick/setImmediate 的执行时机? A process.nextTick 与 Promise 在同一队列同优先级 B process.nextTick 在当前阶段结束后、Promise 之前执行(微任务插队),setImmediate 在 poll 后的 check 阶段执行,两者时机语义不同 ✓ 正确答案 C setImmediate 与 setTimeout(0) 完全等价 D nextTick 递归不会影响事件循环
# 5. Node.js 的模块系统,CommonJS 与 ESM 的互操作? A require 可以加载任意 ESM 并得到全部命名导出 B 模块类型只由扩展名决定 C ESM 无法加载任何 CJS 模块 D ESM 导入 CJS 时 default 恒有、命名导出依赖静态检测,CJS 导入 ESM 有版本与异步限制,互操作需治理双实例与动态 require ✓ 正确答案
# 6. Node.js 的优雅停机(graceful shutdown),SIGTERM/SIGINT 处理、server.close 等待进行中请求、连接超时强杀与 Kubernetes 滚动更新的配合? A 优雅停机先停止接收新连接并等待存量请求,超时强杀兜底,停机总时长需小于 Kubernetes 宽限期并配合就绪探针摘除流量 ✓ 正确答案 B server.close 会立即终止所有连接 C 收到 SIGTERM 应立即退出 D SIGTERM 与 SIGINT 处理完全相同
# 7. Node.js Stream 的四种类型与 pipe 的背压(backpressure)机制?大文件处理为何必须用流? A 流会一次性加载全部数据 B Stream 四类型以块流动数据,pipe 用 highWaterMark 与暂停/恢复实现背压,大文件流式处理内存恒定,推荐用 pipeline 管理错误 ✓ 正确答案 C readFile 适合所有文件大小 D 背压只影响网络流
# 8. cluster 模块与 pm2 的多进程模型,端口共享(SO_REUSEPORT/句柄传递)与优雅重启如何实现? A cluster 通过句柄传递或 SO_REUSEPORT 实现多进程共享端口,pm2 以滚动重启(先摘流量等存量完成)配合优雅停机实现零停机 ✓ 正确答案 B cluster 的 worker 共享内存 C pm2 与 K8s 的职责完全相同 D SO_REUSEPORT 在所有平台行为一致
# 9. Node.js 内存泄漏的常见来源(闭包缓存/事件监听器/全局变量)与 heapsnapshot 排查方法? A 泄漏常见于闭包缓存、事件监听器、全局变量与未清理句柄,用 heapsnapshot 对比与 retaining path 定位持有者 ✓ 正确答案 B 内存泄漏只能靠重启解决 C 监听器重复添加不会泄漏 D 快照抓一次就能定位所有泄漏
# 10. Node.js 的 Cluster 与 Worker Threads 在 CPU 密集场景的取舍,多进程内存模型? A Worker Threads 与 Cluster 完全等价 B Cluster 多进程适合请求级扩展(隔离性好、内存独立),Worker Threads 线程共享进程内存适合 CPU 密集并行,按场景组合选型 ✓ 正确答案 C worker 线程崩溃不影响进程 D 进程间共享内存用 SharedArrayBuffer
# 11. Node.js 的流(Stream)背压机制与内存安全,大文件处理如何避免 OOM? A 流式处理大文件会整文件驻留内存 B write() 的返回值可以忽略 C highWaterMark 越大越安全 D 背压通过 write 返回 false、暂停与 drain 恢复调节节奏,流式处理内存恒定于缓冲级别,推荐 pipeline 并警惕忽略返回值的坑 ✓ 正确答案
# 12. Node.js 的错误处理模式,异步回调错误、Promise 拒绝与全局 uncaughtException/unhandledRejection 的兜底策略,如何避免进程崩溃与静默失败? A 异步回调内错误自动冒泡到调用方 B uncaughtException 后应继续运行 C unhandledRejection 可以忽略 D 错误按回调/Promise/async 路径传播,全局兜底负责记录与受控重启(状态不可信不硬撑),并治理空 catch 防静默失败 ✓ 正确答案
# 13. Node.js 内存与性能调优,--max-old-space-size、堆快照分析、GC 停顿与吞吐的权衡,高并发下如何定位瓶颈(CPU/IO/GC)? A 堆越大 GC 停顿越短 B --max-old-space-size 只影响新生代 C 堆大小影响 GC 频率与停顿的权衡(内存换吞吐),瓶颈定位按事件循环延迟、CPU profile、堆快照与 I/O 层逐层排查 ✓ 正确答案 D CPU 密集与 I/O 密集瓶颈表现相同
# 14. Worker Threads 与子进程的选型,worker_threads 共享内存 vs child_process 独立进程的差异,CPU 密集与 I/O 密集任务各用哪种? A worker_threads 与 child_process 的隔离性相同 B SharedArrayBuffer 用于进程间通信 C 子进程可以共享 JS 对象 D worker_threads 同进程共享资源、通信轻量适合 CPU 密集并行,child_process 强隔离适合不可信/外部程序,I/O 密集通常无需二者 ✓ 正确答案
# 15. CommonJS 与 ESM 在 Node.js 中的互操作边界(require ESM 的限制与 dual package)? A require 能拿到 ESM 的全部具名导出 B require(ESM) 受同步加载限制且具名导出不可用,dual package 会导致双实例,治理上用单入口或共享核心与统一加载策略 ✓ 正确答案 C dual package 只影响性能不影响状态 D ESM 导入 CJS 总是失败
# 16. Node 22+ 的类型剥离(type stripping)与单可执行文件对服务端开发的影响? A SEA 不需要打包器配合 B 类型剥离会做完整的类型检查 C enum 在剥离模式下完整支持 D Node 22+ 的类型剥离让 TS 源码免构建直接运行(仅剥离可剥离语法、不做类型检查),SEA 把应用与运行时打包为单文件分发 ✓ 正确答案
# 17. Node.js 的错误处理,async/await 的异常传播? A async 回调内的错误会自动传播到外层 try/catch B async/await 的异常沿 await 链传播,try/catch 可覆盖异步代码,但异步边界(事件回调)内错误需自行处理,并防忘记 await 与空 catch ✓ 正确答案 C Promise.all 会保留所有结果 D 不 await 的调用不会产生未处理拒绝
# 18. Node.js 的流与背压,可读/可写流的应用? A 可读流只能用于文件读取 B data 事件消费无需处理背压 C 可读/可写流覆盖文件、网络、子进程与转换链场景,背压用 pipe/pipeline 自动管理,手工模式需按 write 返回值暂停与 drain 恢复 ✓ 正确答案 D 流错误会静默忽略
# 19. node:test 内置测试框架(node --test、mock 与断言)在 Node 服务端单元测试的工程价值,与 Jest/Vitest 的取舍? A node:test 需要安装第三方依赖 B node:test 不支持并发 C Vitest 只能在浏览器环境运行 D node:test 是 Node 内置测试框架(断言、mock、覆盖率、分片),零依赖免构建适合服务端测试,复杂 mock 与前端生态选 Vitest/Jest ✓ 正确答案
# 20. Node.js 服务端安全基础,路径遍历、原型污染、命令注入与 SSRF 在 Node 应用中的典型入口与防护? A 原型污染只会影响单个对象 B 路径遍历、原型污染、命令注入与 SSRF 在 Node 中各有典型入口(文件路径、深合并、exec 拼接、用户可控 URL),防护靠输入校验、安全 API 与最小权限 ✓ 正确答案 C exec 拼接用户输入是安全的 D SSRF 只能攻击外部网络