面试题:后端
后端工程师岗位相关的接口设计、服务端基础、并发、存储和稳定性面试准备。
Node.js 运行时由哪些部分组成,JavaScript 代码由谁执行?
Node.js 以 V8 执行 JavaScript,通过 libuv 提供事件循环、异步 I/O 和线程池,并由 Node 的模块、网络和文件 API 连接业务代码与操作系统。
Node.js 事件循环有哪些阶段,定时器和 I/O 回调大致何时执行?
Node 事件循环会在不同阶段处理 timers、pending callbacks、poll、check 和 close callbacks;实际顺序还会受微任务和 I/O 是否就绪影响。
Promise 微任务、queueMicrotask 和 process.nextTick 的执行边界有什么区别?
Promise reaction 和 queueMicrotask 属于微任务,process.nextTick 使用 Node 独有的更高优先级队列;连续递归调度会阻塞 I/O 和定时器。
CPU 密集任务为什么会阻塞 Node.js 服务,怎样隔离?
Node 主线程执行 JavaScript 和回调,长时间计算会阻塞事件循环;应优化算法、拆分工作或转移到 Worker Threads、独立进程或异步任务服务。
libuv 线程池处理哪些 Node.js 工作,线程池大小应怎样设置?
部分文件系统、DNS、加密和压缩等操作可能使用 libuv 线程池;线程池是共享资源,调大前要确认任务类型、CPU 和下游容量。
Node.js 中 callback、Promise 和 async/await 如何处理错误?
callback 通常通过 error-first 约定传错,Promise 通过 reject 传播,async/await 需要 try/catch 或让 Promise 继续向上;三者都需要明确边界。
Node.js 的 uncaughtException 和 unhandledRejection 应怎样处理?
这两类事件表示进程存在未处理错误;它们适合作为最后的记录和退出信号,不能把进程继续运行当作常规恢复策略。
Node.js Stream 的 readable、writable、duplex 和 transform 分别是什么?
Stream 用增量方式处理数据:Readable 产生数据,Writable 接收数据,Duplex 同时读写,Transform 在输入和输出之间转换。
Node.js Stream 背压如何工作,为什么 pipe 比手动 write 更安全?
Writable.write 返回 false 时表示内部缓冲达到水位,生产者应等待 drain;pipe 会自动协调读取暂停和恢复,降低内存失控风险。
Node.js pipeline 和 pipe 在错误处理、关闭和取消上有什么区别?
pipe 便于连接流,但复杂链路的错误和销毁需要额外处理;pipeline 统一监听链路错误并在失败时清理相关流,更适合服务端处理。