Node.js 服务端基础

共 20 题
#

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 只能攻击外部网络