Skip to content

Next.js 原理与运行时

Next.js redirect、notFound 和 error.js 如何划分?

这些 API 都会改变页面控制流,但语义不同;高级实现要让状态码、用户体验、日志和恢复路径对齐。

适合阶段:资深前端 / 错误治理核心能力:Control Flow · Error Boundary · Recovery

面试官想考什么

  • 资源不存在为什么用 notFound 而不是 throw Error? 考察业务状态与系统故障。
  • redirect 在 Server Component 和 Server Action 中有什么差异? 考察响应语义。
  • error.js 的 reset 能恢复什么? 考察边界重试。
  • global-error.js 什么时候使用? 考察根布局故障。

一句话回答

text
notFound 表示当前资源不存在,redirect 表示控制流转移,error.js 隔离可恢复的渲染/请求错误;三者要分别对应状态码、用户动作、日志告警和缓存策略,不能把所有异常都当 500。

面试回答详解

1. 语义区分

  • notFound:资源不存在或不应暴露,渲染 404 语义。
  • redirect/permanentRedirect:用户应去另一个地址。
  • error.js:当前 segment 的错误 UI 和重试入口。
  • global-error.js:根布局或全局结构本身无法渲染时的最后边界。

2. 控制流

这些函数可能通过特殊异常中断当前渲染,因此调用后不要继续依赖后续代码执行。Route Handler 则应返回明确 HTTP 响应,不能把页面控制流 API 当成通用 API 错误格式。

3. reset 边界

reset() 会尝试重新渲染当前错误边界覆盖的 segment,适合瞬时数据失败或临时网络错误。它不能修复数据库损坏、权限拒绝或错误代码本身,应配合有限重试和 fallback。

4. 安全与 SEO

对无权限资源,有时应返回 404 以避免泄露存在性;但要统一产品和审计策略。错误页面不能把内部堆栈、SQL、token 或 provider 错误展示给用户。

5. 观测

记录 route、segment、release、digest、requestId 和错误类别。区分预期 404、用户主动跳转和真正故障,避免告警噪声。

可直接背诵的 30 秒回答

text
notFound 是资源不存在,redirect 是控制流跳转,error.js 是局部错误边界,global-error.js 是根布局故障的最后兜底。实现时我会让它们分别对应 404、3xx、可恢复错误和全局崩溃,并配合错误脱敏、有限 reset、日志分类和权限策略,不能所有问题都返回 500。

扩展知识

错误分类

text
预期业务分支 -> 404/redirect
瞬时依赖失败 -> retry/fallback
程序缺陷 -> error boundary + alert
根结构失败 -> global error + release action

面试官追问链

追问一:error.js 能捕获 Route Handler 的 500 吗?

  • 考察点:边界理解。
  • 回答方向:它主要隔离渲染树错误;API 请求错误要在调用层处理并映射为 UI 状态。

追问二:为什么错误页要有 reset?

  • 考察点:恢复体验。
  • 回答方向:允许用户重试瞬时失败而不刷新整站;同时要限制频率并对确定性错误提供其他动作。

追问三:404 会泄露资源存在性吗?

  • 考察点:安全语义。
  • 回答方向:不同资源可选择 404 或 403,关键是统一信息披露策略,避免未授权用户通过状态差异探测。

推荐阅读

基于 MIT 协议开源