主题
Next.js 原理与运行时
Next.js redirect、notFound 和 error.js 如何划分?
这些 API 都会改变页面控制流,但语义不同;高级实现要让状态码、用户体验、日志和恢复路径对齐。
面试官想考什么
- 资源不存在为什么用 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,关键是统一信息披露策略,避免未授权用户通过状态差异探测。